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



给定以下代码:

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如何区分noise和noise = (parameter)?通常,当用Ruby编写两个方法时,最新的方法胜出,但是我想知道如何以这种方式编写两个同名的方法,而不覆盖另一个方法。

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

之间的差异
def noise

def noise=

如果你在第一种噪声方法中取出=,你会观察到你所期望的行为。如果你真的对ruby中方法查找的细节感兴趣(你应该感兴趣,因为它对每个ruby程序员来说都很重要),请查看这篇文章

Ruby如何区分noisenoise = (parameter) ?

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

=是方法名的一部分。当在方法名的末尾使用=时,您可以使用参数来调用该方法,并设置 @noise:

animal.noise=('baaaa')

但是Ruby的语法糖允许你简单地写

animal.noise = 'baaaa'

然后为获取返回@noise的值我们调用noise方法:

animal.noise #=> 'baaaa'

最新更新