2013-03-18 18 views
4

爲什麼給Class.new分配一個名稱/常量的行爲是這樣的?命名Class.new

c = Class.new #=> <Class:0xnnnnnnn> 
puts c #=> <Class:0xnnnnnnn> 

b = c 
puts b #=> <Class:0xnnnnnnn> 

NewClass = c #=> NewClass <shouldn't it be same as above #=> <Class:0xnnnnnnn> 
puts c #=> NewClass <and now c has a name although it was not the left operand above> 

回答

3

後者相當於使用kernel::const_set

語義class NewClass相當於

c = Class.new 
Kernel::const_set :NewClass, c 

和分配到一個恆定即NewClass = c在語義上等同於

Kernel::const_set :NewClass,c 

所以當你寫

c = Class.new 
NewClass = c 

它的語義一樣寫

class NewClass 
4

因爲這是如何紅寶石的作品。 (我今天的第二個答案,從這句話開始:)

您可以創建動態匿名類並使用它們。但是,一旦首次賦予一個常量,該類將該常量的名稱作爲自己的名字。這是最後的,你現在不能改變名字。

0

NewClass是對常量的引用。任何以大寫字母開頭的引用都是常量,並在執行過程中保持這種狀態。

如果您要對任何這些變量調用'.object_id',它們將是相同的。

如果您調用'Module.constants',您會在頂級常量列表中看到NewClass。參考將從那裏拉。