📖
【bugs.ruby Advent Calender】Array#== の挙動に関する話【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
が定義されている場合は配列として振る舞う』という性質の元こういう挙動になっているみたいですね。
知らなかった。
Discussion