という定数名があるFoo::Bar::Baz
場合、これらの各レベルをドリルダウンして、定数が存在するかどうかを判断するにはどうすればよいでしょうか?
質問する
98 次
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 に答える