为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

眼眸繁星 2019-10-19 16:34:54

我正在学习编程,因此决定尝试Ruby。我确定这是一个愚蠢的问题,但是讲师在谈论setter和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方法(这两个方法中的第二个),就无法与实例变量@noise进行交互。


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


class Human

  def noise=(noise)

    @noise = noise

  end

end


man = Human.new

puts man.noise=("Howdie!")

这与使用getter方法时的工作原理相同。


所以现在我很困惑。为什么需要吸气剂?如果没有实例变量,教员意味着什么呢?他可能正在使用旧版本的Ruby吗?


在此先感谢您的帮助。


查看完整描述

3 回答

?
Cats萌萌

您可以通过属于该实例的其他方法与该实例变量进行交互,即使没有getter:


def noise=(noise)

  @noise = noise

end


def last_noise

  @noise

end

不需要使用与方法相同的名称定义吸气剂。两者根本没有联系。需要getter来“获取”实例变量的值,但仅使用简短的语法即可。


发生了什么事在你的例子是,你初始化一个新的对象(Human.new),然后使用方法(noise=是的方法名称包含=符号),只是那么恰巧定义一个实例变量(即变量只(针对该实例),然后最终通过另一个方法调用检索该实例变量。


您实际上可以使用它instance_variable_get来获取实例变量,而无需定义任何 getter:


man = Human.new

man.noise = "Howdie"

man.instance_variable_get("@noise")

即使未定义吸气剂,也将返回“ Howdie”。


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


查看完整回答
反对 回复 2019-10-19
?
牛魔王的故事

代码行


puts man.noise=("Howdie!")

不使用getter方法,因此不需要定义getter方法即可工作。该行仅使用setter方法。setter方法的返回值自动等于等号右侧的值,因此“ Howdie!” 被传给puts。


代码行


puts man.noise

确实使用getter方法,如果删除getter方法,它将无法正常工作。


查看完整回答
反对 回复 2019-10-19
?
天天世纪

当然,它们都返回一个值,但是它们的行为是不同的。

假设已经有一个成员@a 。

使用getter,@a无需修改即可获取的当前值。

使用二传手,可以修改@a并获取其新值作为返回值。

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

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

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


查看完整回答
反对 回复 2019-10-19

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信