鉴于我有Foo::Bar::Baz
的常量名称,我如何深入了解每个级别并确定常量是否存在?
答案 0 :(得分:3)
defined?(Foo) # => nil
module Foo; end
defined?(Foo) # => "constant"
defined?(Foo::Bar) # => nil
module Foo::Bar; end
defined?(Foo::Bar) # => "constant"
defined?(Foo::Bar::Baz) # => nil
module Foo::Bar; Baz = :baz end
defined?(Foo::Bar::Baz) # => "constant"
答案 1 :(得分:1)
这是我最终做的事情,以防其他人遇到这个:
unless Object.const_defined? const_name
const_name.split('::').inject(Object) do |obj, const|
unless obj.const_defined? const
# create the missing object here...
end
obj.const_get(const)
end
end
答案 2 :(得分:1)
听起来你想要使用定义的?运营商。 Check if a constant is already defined对此有更多了解。
答案 3 :(得分:1)
其他人谈论defined?
运算符(是的,它是内置的一元运算符,而不是方法!!!),但还有其他方法。我个人赞成这个:
constants #=> a big array of constant names
constants.include? :Foo #=> false
module Foo; end
constants.include? :Foo #=> true
Foo.constants.include? :Bar #=> false
module Foo
module Bar; end
end
Foo.constants.include? :Bar #=> true
# etc.
我必须承认defined?
运营商的一点是它的可靠性。它不是一种方法,因此永远不会被重新定义,因此总能做到你对它的期望。另一方面,可以使用更多环形(并且不太可靠)的方式,例如:
begin
Foo::Bar::Baz
puts "Foo::Bar::Baz exists!"
rescue NameError
puts "Foo::Bar::Baz does not exist!"
end