2010-08-03 28 views
4

我有兩個具有相同名稱的Const;一個是全局常量,另一個是在命名空間Admin下定義的。但我需要對它們進行區分;全球一個已定義,範圍的一個需要自動定義,如果它尚未定義:如何判斷是否在模塊命名空間中定義了一個常量,而不是全局的?


A = 'A Global Const' 
module Admin 
    A = 'A Const within the Admin namespace' if const_defined? 'A' # always true and the Admin::A can never be defined! 
end 
puts A # => 'A Global Const' 
puts Admin::A # => NameError: uninitialized constant Admin::A 
# the Admin::A will never be defined. 

但如果全球A定義,「const_defind?」部分將永遠返回真實!
我甚至曾嘗試:


... if defined? A 
... if self.const_defined? 'A' 
... if Object.const_get('Admin').const_defined? 'A' 

永遠如此!
我需要區分它們,因爲我需要在A和Admin :: A中使用A兩種形式;
像公共使用的情況PostsController和管理員使用的Admin :: PostsController;
幫助!

回答

3

事實上,const_defined?const_get通過層次結構,其中模塊包括(artificiallyObject類。您可以使用Module#constants避免這種情況,雖然:

module Admin 
    A = 'A Const with in the Admin namespace' unless constants.include?(:A) 
end 

:在Ruby 1.8,你對證"A",不:A

+0

正是我想要的。謝謝Lafortune! – Croplio 2010-08-03 17:13:52

0

使用其#class#to_s#inspect可能會幫助您知道您定義的對象是否實際上是全局性的。

6

你應該嘗試他們的範圍界定,以測試你想要的一個

module Adm 
    A = "FOO" 
end 
defined?(A) # -> nil 
defined?(Adm::A) # "constant" 
defined?(::A) # -> nil 
A = "BAR" 
defined?(::A) # -> "constant 
::A # => "BAR" 
Adm::A # => "FOO" 
相關問題