Ruby如何区分Method和Method =(参数)(同名getter / setter方法)?

时间:2016-10-18 20:27:59

标签: ruby class object

给出以下代码:

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

  def noise
    @noise
  end
end

animal1 = Animal.new
animal1.noise = "Moo!"
puts animal1.noise

animal2 = Animal.new
animal2.noise = "Quack!"
puts animal2.noise

Ruby如何区分噪音和噪音=(参数)?通常当在Ruby中编写两个方法时,最新的方法会胜出,但只是想知道如何以这种方式编写两个同名方法,而不会覆盖另一个。

2 个答案:

答案 0 :(得分:3)

因为这是两个不同的方法名称。在ruby中,具有=的方法名称是赋值方法的习惯用法。当解释器解析源代码时,它会看到

之间的区别
def noise

def noise=

如果您要在第一种噪音方法中取出=,您会观察到您所期望的行为。如果你真的对如何在ruby中查找方法的细节感兴趣(并且你应该知道每个红宝石程序员都非常重要),请查看post

答案 1 :(得分:3)

  

Ruby如何区分noisenoise = (parameter)

因为他们有不同的名字。 noise=(parameter)(正确定义,没有空格,通常称为 setter方法因为设置 @noise)与noise不同(通常被称为 getter方法,因为获取 @noise)。

=是方法名称的一部分。在方法名称末尾使用=时,可以使用参数 set @noise调用该方法:

animal.noise=('baaaa')

但Ruby的syntactic sugar允许你简单地写。

animal.noise = 'baaaa'

然后获取返回@noise的值,我们称之为noise方法:

animal.noise #=> 'baaaa'