2016-10-18 35 views
2

鑑於以下代碼:Ruby如何區分Method和Method =(參數)(同名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中寫出兩種方法時,最新的方法會勝出,但只是想知道如何以這種方式寫入兩個同名的方法,而不會覆蓋另一個方法。

+2

在一種情況下該方法的名稱包括等號:':噪聲='。 Ruby允許你將它寫成'noise =(other)'或'noise = other'。後者有時被稱爲「語法糖」。 –

+0

你從哪裏知道他們有相同的名字?它們顯然是不同的:「def」之後和參數之前的字符串是名稱。 –

+1

我從animal1.noise =「Moo!」這一事實中得到了答案。並放入animal1.noise有一個相同的字符串(animal1.noise)。在等號之後,我假設所有的東西都是方法的一部分,而不是方法的名稱。 – the12

回答

3

因爲這些是兩種不同的方法名稱。在ruby中,這是一個成語,方法名稱爲=是一種賦值方法。當解釋器在解析源代碼,它看到

def noise 

def noise= 

之間的差異如果你要拿出=在第一噪聲的方法,你會看到你所期望的行爲。如果你是在方法如何查找在紅寶石作品的來龍去脈真正感興趣的(你應該是因爲它真的非常重要,每一個Ruby程序員就知道了)結帳這個post

3

如何紅寶石noise和區分noise = (parameter)

由於它們有不同的名稱。 noise=(parameter)(正確地沒有空格定義並且通常被稱爲一個setter方法因爲它 @noise)是不一樣的noise(通常被稱爲一個getter方法因爲它得到 @noise)。

=是方法名稱的一部分。當一個方法名稱末尾使用=,然後你可以調用該方法與參數設置 @noise:

animal.noise=('baaaa') 

但Ruby的syntactic sugar讓您只需編寫。

animal.noise = 'baaaa' 

然後向得到背面的@noise值我們稱之爲noise方法:

animal.noise #=> 'baaaa' 
相關問題