2014-06-10 48 views

回答

1

Ruby中的所有頂級常量都將添加到Object,如您在Object.constants中看到的那樣。這樣做的好處是每個類都繼承自Object,因此所有的頂級常量總是可用的(正如您可能直覺地期望的那樣)。

現在假設Module#constants按照預期工作:每個類都列出它從Object繼承的頂級常量。真是一種痛苦!我們會不斷地寫Foo.constants - Object.constants這意味着「常常是不常用的常量」。

Ruby的設計者認爲這種頭痛並增加了一個特殊的例外rb_mod_const_of - 用於步行的繼承鏈,並找到常數C函數:

if (tmp == rb_cObject && mod != rb_cObject) break; 

即如果我們在繼承鏈中已經達到Object,並且我們不尋找Object本身的常量,請停止尋找。

+0

不是黑魔法,只是普通的舊C代碼。雖然你是對的,但是理解類/模塊/對象繼承鏈並非易事:-) – DMKE

+2

如果是這種情況,那麼當你聲明一個新類Foo時,常量Foo駐留在哪裏?我認爲它將駐留在Object類中,就像您聲明的任何其他常量一樣。如果Foo要駐留在Object類中,那麼Object.constants應該真的返回您引用的大量列表,包括Foo –

+0

@ user3727771您是對​​的。經過進一步調查,「Object.constants」確實正在調用實例方法。我不清楚爲什麼我們沒有看到每個班級常量的完整列表。我正在通過C代碼挖掘原因。用實際答案編輯 – Max

相關問題