试图学习/理解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@noise进行交互。
但是,当我删除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
,并得到它的新值作为返回值。
在考虑二传手的行为时,请注意:
-
@a的旧值无法用setter获得,并被覆盖。
-
实际上在调用setter之前已经知道了setter返回的内容。
可能是getter和setter的注意力是因为一些其他的语言允许你直接访问类variables。 python:
class k: i = 100 print ki # 100 ki = 200 print ki # 200
相比之下,Ruby保持其所有的variables对于类是完全私有的,只能通过访问器方法公开它们。
在你的例子中,如果你移除了getter,你确实可以通过setter与variables(即:改变它)进行交互,但是当你需要的时候你无法取回(以一种常规的方式)。