📚

[Bug #20043] `defined?` checks for method existence but only sometimes

2024/01/28に公開

[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?([*a])         # => nil
defined?(itself(*a))   # => nil
defined?([*itself]     # => "expression"
defined?({a => a})     # => nil
defined?({itself => itself})   # => "expression"
GitHubで編集を提案

Discussion