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?オペレーターについて認めなければならないことの1つは、その信頼性です。これはメソッドではないため、再定義することはできず、常に期待どおりの動作をします。一方、次のような、より迂回した (そして信頼性の低い) 方法を使用することもできます。

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 に答える