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

Nat*_*han 46 ruby

我只是学习编程并决定尝试Ruby.我确定这是一个愚蠢的问题,但是教练正在讨论setter和getter方法,我很困惑.这是一个例子:

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

  def noise
    @noise
  end
end
Run Code Online (Sandbox Code Playgroud)

从这个,实例化类,我可以把它说出来:

man = Human.new
man.noise=("Howdie!")
puts man.noise
Run Code Online (Sandbox Code Playgroud)

这导致了 Howdie!

现在令我困惑的是,教师说没有getter方法(两种方法中的第二种),就没有办法与实例变量@noi​​se进行交互.

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

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

man = Human.new
puts man.noise=("Howdie!")
Run Code Online (Sandbox Code Playgroud)

这与使用它的getter方法相同.

所以现在我很困惑.为什么需要吸气剂?没有它,教师的意思是无法访问实例变量?他有可能使用旧版本的Ruby吗?

在此先感谢您的帮助.

Rya*_*igg 34

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

def noise=(noise)
  @noise = noise
end

def last_noise
  @noise
end
Run Code Online (Sandbox Code Playgroud)

不需要使用与方法相同的名称定义getter; 这两者根本没有联系.吸气剂需要"得到"的实例变量的值,但只在一个很短的语法.

你的例子中发生的事情是你正在初始化一个新的对象(Human.new),然后使用一个方法(noise=是的,方法名称包含=符号),这恰好恰好定义了一个实例变量(即,一个变量只是对于该实例),然后最后使用另一个方法调用检索该实例变量.

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

man = Human.new
man.noise = "Howdie"
man.instance_variable_get("@noise")
Run Code Online (Sandbox Code Playgroud)

这将返回"Howdie",即使没有定义getter.

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

  • +1瑞恩.像往常一样,你的专业知识擅长,我不知道instance_variable_get! (2认同)

Dav*_*son 14

代码行

puts man.noise=("Howdie!")
Run Code Online (Sandbox Code Playgroud)

不使用getter方法,因此不需要为其工作定义getter方法.该行只使用setter方法.setter方法的返回值自动等于等号右边的任何值,所以"Howdie!" 传递给puts.

代码行

puts man.noise
Run Code Online (Sandbox Code Playgroud)

是否使用了getter方法,如果删除getter方法,它将无效.


Jok*_*ter 5

当然,他们都返回一个价值,但他们的行为是不同的.

假设已有会员@a .

使用getter,可以获得当前值@a,而无需修改它.

使用setter,一个修改@a,并将其新值作为返回值.

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

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

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