RubyのArrayとHashは==で中身の比較を行う
タグ: ruby / 初版公開: 2014-08-04

一般的に、Rubyでオブジェクト同士を==で比較すると、オブジェクトIDの比較となる。 ==を再定義してある場合は例外で、例えばStringは文字列の内容が比較される。

ではArrayHashはどうなのか。 実はArrayHash==すると中身の比較が行われる。

よって以下のような比較が可能である。 単純なHashとArrayはもちろんのこと、複雑に構成されたオブジェクトもこのとおりだ。

p [1, 2, 3] == [1, 2, 3] #=> true
p ({a:1, b:2, c:3} == {a:1, b:2, c:3}) #=> true
p ([{a:1, b:2}, {array:[3, 4, 5]}] == [{a:1, b:2}, {array:[3, 4, 5]}]) #=> true

私は何となくオブジェクトIDの比較になりそうな気がして、無意識のうちにこのようなコードを書くのは避けていた。反省。

ArrayHash==の挙動については、きちんとリファレンスにも書いてある。

Array

自身と other の各要素をそれぞれ順に == で比較し て、全要素が等しければ true を返します。そうでない場合には false を返します。

Hash

自身と other が同じ数のキーを保持し、キーが eql? メソッドで比較して全て等しく、 値が == メソッドで比較して全て等しい場合に真を返します。

これからは安心してArrayHash==で比較してゆきたい。