2014-10-18 61 views
1

類的方法在此代碼:自我VS類的名字在繼承

class Dog 
    def self.bark 
    print "woof" 
    end 
end 

class Little_dog < Dog 
end 

Little_dog.bark 

的方法是從廣義類引用self繼承。但下一批代碼:

class Dog 
    def Dog.bark 
    print "woof" 
    end 
end 

class Little_dog < Dog 
end 

Little_dog.bark 

也有效。我期待它給我一個錯誤,但它沒有。

self如何引用類繼承下的類方法?爲什麼little_dog類在第二個例子中有一個類方法bark,當我僅將它定義爲Dog的類方法?

回答

3

self被廣泛用於Ruby Metaprogramming

Metaprogramming Ruby書:

Ruby代碼的每一行是一個對象的所謂 當前對象內執行。當前對象也被稱爲self,因爲您可以使用self關鍵字訪問它,因爲 。

在給定的時間只有一個對象可以扮演自己的角色,但沒有一個對象持有這個角色很長一段時間。特別是,當您撥打 方法時,接收器將變爲自我。從那一刻開始,所有實例 變量都是self的實例變量,並且在沒有明確接收者的情況下稱爲 的所有方法都在self上調用。只要您的代碼 顯式調用某個其他對象上的方法,該其他對象 就會變爲自己。

所以,在代碼:

class Dog 
    # self represents the class object i.e: Dog. Which is an instance of Class. 
    # `bark` will be treated as class method 
    def self.bark 
    print "woof" 
    end 
end 

也可以寫爲:

class Dog 
    # Dog is an instance of Class. 
    # `bark` will be treated as class method 
    def Dog.bark 
    print "woof" 
    end 
end 

繼承允許子類來使用它的父類的功能。這就是爲什麼你可以在Little_dog類訪問bark方法,因爲它是繼承Dog類:

class Little_dog < Dog 
    # has `bark` as a class method because of Dog 
end 

Ruby style guide tip:在Ruby中它被認爲是使用首字母大寫的約定來命名類和模塊的最佳做法。

1

當你定義類的方法實際上,如果你使用

Dog.bark 

self.bark 

兩種方法都無所謂定義將由子類繼承類的方法。

唯一不同的是,當你將班級狗的名字改爲別的東西時,比如BigDog - 當你使用Dog.bark時,顯然需要更改爲BigDog.bark

使用self方法定義時,self.bark仍然有效。

+0

是典型的所有語言?例如python? – 2014-10-18 11:31:41

+0

我不確定:)您可能需要一個更瞭解Python的人,然後我才能正確回答這個問題。 – Esse 2014-10-18 11:35:39

+0

另外:在其他情況下(如在*方法中使用'''''''''''''''''''''''''''' – Esse 2014-10-18 11:36:22