如何做好這項工作
簡單:它沒有。無論如何,不在Ruby中。
就像在其他大多數語言中一樣,有一些核心實體被簡單地假設存在。它們從天而降,變得空氣稀薄,奇蹟般地出現。
在Ruby中,其中的一些神奇的事情是:
Object
沒有一個超類,但你不能沒有超定義一個類,隱含的直接超類總是Object
。 [注意:可能有實現定義的超類Object
,但最終會有一個沒有超類的。]
Object
是Class
一個實例,這是Object
子類(這意味着間接Object
是Object
自身的實例)
Class
被的Module
一個子類,其是Class
Class
一個實例是Class
的一個實例
這些事情都不能在Ruby中解釋。
BasicObject
,Object
,Module
和Class
都需要同時存在,因爲它們具有循環依賴性。
僅僅因爲這種關係不能用Ruby代碼表達,並不意味着Ruby語言規範不能說它必須如此。實現者需要找出一種方法來實現這一點。畢竟,Ruby實現對程序員不具備的對象有一定的訪問權限。
例如,Ruby實現可以先創建BasicObject
,同時設置了superclass
指針和class
指針null
。
然後,它會創建Object
,其superclass
指針設置爲BasicObject
及其class
指針null
。
接下來,它會創建Module
,其superclass
指針設置爲Object
及其class
指針null
。
最後,它創建Class
,其superclass
指針設置爲Module
及其class
指針null
。現在
,我們可以覆蓋BasicObject
的,Object
的,Module
's和Class
的class
指針指向Class
,我們就大功告成了。
這很容易從系統外部做,它看起來很奇怪。
然而,他們一旦確實存在,那麼完全可以在純Ruby中實現其大部分行爲。您只需要這些類的準系統版本,這要感謝Ruby的開放類,您可以稍後添加任何缺少的功能。
在您的例子中,class Class
不創建一個名爲Class
新的類,它被重新打開現有類Class
,這是由運行時環境給我們。
所以,這是完全可能的解釋平原紅寶石Class#new
默認行爲:
class Class
def new(*args, &block)
obj = allocate # another magic thing that cannot be explained in Ruby
obj.initialize(*args, &block)
return obj
end
end
[注:實際上,initialize
是私有的,所以你需要使用obj.send(:initialize, *args, &block)
繞過訪問限制]
作者:Class#allocate
是另一個那些神奇的東西。它在Ruby的對象空間中分配一個新的空對象,這是Ruby中無法做到的。因此,Class#allocate
也必須由運行時系統提供。
'Class.class#=> Class' – Flexoid
它一直都是烏龜! –
另請參見[類/對象悖論混亂](http://stackoverflow.com/questions/7675774/the-class-object-paradox-confusion)。 –