我有两个同名的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两种形式;
像PostsController一样供公众使用,Admin :: PostsController供管理员使用;
救命!
答案 0 :(得分: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"
答案 1 :(得分:3)
确实,const_defined?
和const_get
遍历层次结构,对于模块包括(artificially)Object
类。不过,您可以使用Module#constants
来避免这种情况:
module Admin
A = 'A Const with in the Admin namespace' unless constants.include?(:A)
end
注意:在Ruby 1.8中,您检查"A"
,而不是:A
答案 2 :(得分:0)
使用其#class
或#to_s
或#inspect
可以帮助您了解您定义的对象是否实际上是全局的。