📖

【bugs.ruby Advent Calender】Array#== の挙動に関する話【10日目】

2024/12/10に公開

bugs.ruby Advent Calender 10日目の記事です。

これはなに

今年1年間通してみてきた bugs.ruby のチケットの中から気になったものを1つずつ取り上げていく Advent Calender です。
取り上げるチケットは基本的にこのブログで取り上げたものになります。
記事のまとめは ここを参照 してください。

[Misc #20509] Document importance of #to_ary and #to_hash for Array#== and Hash#==

例えば [1, 2, 3] == obj をいうコードがあったときに obj.to_ary が定義されていれば obj == [1, 2, 3] という挙動になります。

class X
  def ==(other)
    true
  end

  def to_ary
    [1, 2, 3]
  end
end

obj = X.new

pp [1, 2, 3] == obj
# => true

このときに注意したいのが #to_ary メソッドは『定義されているかどうか』だけに利用されて『 #to_ary の戻り値がなんなのか』は関係ないということです。
何なら次のように #to_ary メソッドで例外が発生しても次のコードはエラーになりません。

class X
  def ==(other)
    true
  end

  def to_ary
    raise "hogeeeee"
  end
end

obj = X.new

pp [1, 2, 3] == obj
# => true

これは『 #to_ary が定義されている場合は配列として振る舞う』という性質の元こういう挙動になっているみたいですね。
知らなかった。

関連

GitHubで編集を提案

Discussion