2

鉴于我有一个常量名称Foo::Bar::Baz,我如何深入了解每个级别并确定该常量是否存在?

4

4 回答 4

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"
于 2013-05-24T20:59:09.393 回答
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
于 2013-05-24T21:15:02.897 回答
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
于 2013-05-24T20:48:40.980 回答
1

听起来你想使用定义的?操作员。检查是否已经定义了一个常量,对此有更多的了解。

于 2013-05-24T20:50:57.047 回答