📚
[Bug #20043] `defined?` checks for method existence but only sometimes
[Bug #20043] defined?
checks for method existence but only sometimes
-
defined?
はメソッドの存在をチェックするが、たまにしかチェックしないというバグ報告 - 例えば以下のようなコードであれば
expression
を返す
p defined? [] # => "expression"
p defined? [*a] # => "expression"
p(defined? [])
p(defined? [*a])
- しかし、次のように未定義?の値を渡すと
nil
が返ってくるケースもある
def a; end
# これはなにかしら意図する値が返ってくる
p defined?(a) # => "method"
p defined?([a]) # => "expression"
# これは nil が返ってくる
p defined?(b) # => nil
p defined?([b]) # => nil
- またこれは通常のメソッドでも同じような挙動になる
p defined?(itself) # => "method"
p defined?(itself(a)) # => nil
p defined?(itself(*a)) # => "method"
- また
[]
は中身までチェックするんですが{}
は中身までチェックしないみたいですね
p defined?([[[a]]]) # => nil
p defined?({ a => a }) # => "expression"
-
defined?(foo(*a))
が"method"
を返すようになったのは 1.9 からのバグぽいらしいですね? - いまは以下のような挙動になる PR が出されてます
- https://github.com/ruby/ruby/pull/9500
- 基本的にメソッドが定義されていれば
nil
以外、定義されていなければnil
みたいな挙動ですかね?
defined?([*a]) # => nil
defined?(itself(*a)) # => nil
defined?([*itself] # => "expression"
defined?({a => a}) # => nil
defined?({itself => itself}) # => "expression"
Discussion