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

Cro*_*lio 4 ruby namespaces module constants

我有两个同名的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.
Run Code Online (Sandbox Code Playgroud)

但如果定义了全局A,那么"const_defind?" 部分将永远回归!
我甚至尝试过:


... if defined? A  
... if self.const_defined? 'A'  
... if Object.const_get('Admin').const_defined? 'A'  
Run Code Online (Sandbox Code Playgroud)

总是如此!
我需要区分它们,因为我需要使用A中的A和Admin :: A两种形式;
像PostsController一样供公众使用,Admin :: PostsController供管理员使用;
救命!

Pau*_*bel 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"
Run Code Online (Sandbox Code Playgroud)