2013-08-18 37 views

回答

0

對於像類這樣的對象來說,當創建一個新類時,它的特徵類也會被創建,以及它們在被創建時的對象。

例如: - 創建類

class User; end 

User = Class.new 

其eigenclass也同時產生,

並且有一個單獨的eigenclass針對每個對象創建用戶等級

5

每個對象總是有一個單例類。期。沒有ifs,沒有buts,沒有例外。

根據編譯器或解釋器的聰明程度,它可能會或可能不會執行一些性能優化。但是,像所有的性能優化,這些都是不允許更改程序的結果,所以即使這些性能優化導致其中某一項單獨的類不實際上並不存在一定的狀態,該程序仍必須的行爲好像它確實存在,所以你無論如何都不能說出來。畢竟,這幾乎是「性能優化」中的定義。一些Ruby實現可能會做一些優化,其他的可能會做其他的優化,有些甚至可能不會做任何優化根本就不是。你不能從你的程序的結果中知道,你不應該在意,你一定不要在乎

例如,YARV執行以下優化:

  • 由於幾乎沒有對象有singleton方法,創建用於單個類每對象將是浪費內存,因此單類延遲方式創建:當您創建一個單例方法(def foo.barObject#define_singleton_method)時,當您打開單例類(class << foo),並且當您要求對象的單例類(Object#singleton_class)時。

  • 由於幾乎每個類都有某種類方法,懶惰地創建單例類的開銷沒有意義,所以對於類,單例類始終是急切地創建的。

但是這是YARV的私人內部實現細節。 JRuby可能會有所不同。 IronRuby可能會有所不同。 MacRuby可能會做不同的事情。 MRuby可能會有所不同。黃玉可能會有所不同。魯比尼烏斯可能會做不同的事情。 MagLev可能會有所不同。即使是YARV的下一個補丁級別也可能會有所不同。

如果你看看它的單例類。如果你不是看看它,它是否在那裏並不重要。所以,在語義上,它總是在那裏。