如何判断是否已在模块命名空间中定义了Constant,而不是全局命名空间?

我有两个同名的Const; 一个是全局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中的A和Admin :: A两种forms;
像PostsController一样供公众使用,Admin :: PostsController供管理员使用;
救命!

确实, const_defined?const_get遍历层次结构,模块包括( 人工 ) Object类。 但是,您可以使用Module#constants来避免这种情况:

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

注意 :在Ruby 1.8中,您检查"A" ,而不是:A

你应该尝试确定它们的两个范围来测试你想要的那个

 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" 

使用其#class#to_s#inspect可以帮助您了解您定义的对象是否实际上是全局的。