试图学习/理解Ruby setter和getter方法

我正在学习编程,并决定尝试Ruby。 我相信这是一个愚蠢的问题,但教练正在谈论二传手和getter方法,我很困惑。 这是一个例子:

class Human def noise=(noise) @noise = noise end def noise @noise end end 

从这里开始,这个类被实例化了,我可以这样说:

 man = Human.new man.noise=("Howdie!") puts man.noise 

这导致了Howdie!

现在让我困惑的是,教师没有使用getter方法(两种方法中的第二种),没有办法与实例variables@noi​​se进行交互。

但是,当我删除getter方法,我仍然可以访问@noise,请参阅示例:

 class Human def noise=(noise) @noise = noise end end man = Human.new puts man.noise=("Howdie!") 

这与其使用的getter方法相同。

所以现在我很困惑。 为什么需要吸气剂? 如果没有它,不能访问实例variables,教师意味着什么? 他有可能使用旧版本的Ruby吗?

在此先感谢您的帮助。

即使没有getter,您也可以从属于该实例的其他方法与该实例variables进行交互:

 def noise=(noise) @noise = noise end def last_noise @noise end 

没有必要使用与方法相同的名称定义一个getter。 两者根本没有联系。 getter需要“获取”实例variables的值,但只能用简短的语法。

在你的例子中发生的事情是,你正在初始化一个新的对象( Human.new ),然后使用一个方法( noise= ,是方法名称包含=符号),只是这样恰好定义一个实例variables也就是说,这个实例只是一个variables),然后用另一个方法调用来获取那个实例variables。

实际上你可以使用instance_variable_get来获取实例variables,而不需要定义任何 getter:

 man = Human.new man.noise = "Howdie" man.instance_variable_get("@noise") 

这将返回“Howdie”,即使没有定义getter。

不,我不认为他使用的是旧版本的Ruby。

代码行

 puts man.noise=("Howdie!") 

不使用getter方法,所以getter方法不需要定义它的工作。 该行只是使用setter方法。 setter方法的返回值自动等于等号右边的任何值,所以“Howdie!” 得到通过puts

代码行

 puts man.noise 

是否使用getter方法,并且如果删除getter方法则不起作用。

他们当然都会回报一个价值,但是他们的行为是不一样的。

假设已经有一个成员@a

用getter,获得@a的当前值,而不修改它。

用setter,一个修改@a ,并得到它的新值作为返回值。

在考虑二传手的行为时,请注意:

  1. @a的旧值无法用setter获得,并被覆盖。

  2. 实际上在调用setter之前已经知道了setter返回的内容。

可能是getter和setter的注意力是因为一些其他的语言允许你直接访问类variables。 python:

 class k: i = 100 print ki # 100 ki = 200 print ki # 200 

相比之下,Ruby保持其所有的variables对于类是完全私有的,只能通过访问器方法公开它们。

在你的例子中,如果你移除了getter,你确实可以通过setter与variables(即:改变它)进行交互,但是当你需要的时候你无法取回(以一种常规的方式)。