给定以下代码:
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如何区分
noise
和noise = (parameter)
?
因为他们有不同的名字。noise=(parameter)
(定义正确,没有空格,通常被称为setter方法,因为它设置 @noise)与noise
(通常被称为getter方法,因为它获取 @noise)不同。
=
是方法名的一部分。当在方法名的末尾使用=
时,您可以使用参数来调用该方法,并设置 @noise:
animal.noise=('baaaa')
但是Ruby的语法糖允许你简单地写
animal.noise = 'baaaa'
然后为获取返回@noise
的值我们调用noise
方法:
animal.noise #=> 'baaaa'