2011-10-27 50 views
0

最近,我正在研究關於Ruby類的一些細節,並且被類定義弄糊塗了。關於Ruby中的類定義

在Ruby中,類定義如下,

class A 
    def self.my_method 
    end 
end 

和它一樣

class A 
    class << self 
     def my_method 
     end 
    end 
end 

然後我被搞糊塗了。對於第一種情況,self可以被看作是當前使用對象的指針,而當前上下文的類是A.並且遞歸地執行查找方法。但我的問題是,def做什麼?它如何改變當前的對象和上下文?第二種情況的問題是一樣的。如何描述如類< < self更改當前對象和上下文?

還有一個問題。據我所知,所有的Class對象都遵循像fly-weight這樣的設計模式,因爲它們共享具有相同定義的同一個Class對象。然後特徵類變得混亂。由於本徵類中的def實際上定義了一個帶有Class對象的方法,它如何與「def self。*」相關?

從外面看起來太複雜了,我可能需要Ruby的設計細節。

+1

實際上我沒有得到你的困惑...... self是單例類實例,所以'def self.foobar'聲明瞭一個類方法,而'def foobar'聲明瞭一個實例方法,其中self是當前實例。 至於你的情況......他們不應該都是一樣的嗎? (你正在聲明類方法) – robustus

+2

也許這有助於:http://stackoverflow.com/questions/1630815/why-isnt-the-eigenclass-equivalent-to-self-class-when-it-looks-so-similar/ 1631005#1631005 –

回答

4
class A 
    # self here is A 
    def aa 
    # self here is the instance of A who called this method 
    end 
    class << self 
    # self is the eigenclass of A, a pseudo-class to store methods to a object. 
    # Any object can have an eigenclass. 
    def aa 
     # self is the pseudo-instance of the eigenclass, self is A. 
    end 
    end 
end 

這是相同的:

class A 
    def self.aa 
    end 
end 

而且這樣的:

class << A 
    def aa 
    end 
end 

而且也是這樣:

def A.aa 
end 

您可以打開任何事物的eigenclass:

hello = "hello" 
class << hello 
    def world 
    self << " world" 
    end 
end 
hello.world #=> "hello world" 
"my".world #=> NoMethodError 

一個特徵類實際上是一個類的實例,它也有它自己的特徵類。

「如果它看起來太混亂了,請記住Class是一個對象,而Object是一個類。」

+2

最後一句啓發了我。謝謝! – Davidsun