2014-03-12 68 views
1

是否有我的L常量?模塊類<< self constants

module M 
    class Z 
    class << self 
     L = "foo" 
    end 
    end 
end 

=> M::Z::L 
=> NameError: uninitialized constant M::Z::L 
=> M::Z.constants 
=> [] 

module B 
    class N 
    X = "bar" 
    end 
end 

=> B::N::X 
=> "bar" 
=> B::N.constants 
=> [:X] 

我讀this但我不明白。

+0

[常量在類中的自身塊](http://stackoverflow.com/questions/2281057/constant-in-class-self-block) – toro2k

+0

@ toro2k是的我看到了,但這是一個骯髒的黑客。 –

回答

2

你需要的做的事:

module M 
    class Z 
    class << self 
     L = "foo" 
    end 
    end 
end 

M::Z.singleton_class::L # => "foo" 

L是單例類的Z內部定義。

"L"存儲在單個類的常量集合M::Z中,現在可以稱其爲SM::Z::L它實際上是在M::Z及其祖先的常量表中搜索這個常量L。因爲它們都不是S,查找失敗。

+0

我忘記了特徵類)) –

+0

這是我的一個祕密。它被稱爲[singleton class](http://www.ruby-doc.org/core-2.1.1/Object.html#method-i-singleton_class)。 – Max

相關問題