Rubyのオブジェクトの同値性、同一性等の比較方法
Rubyでオブジェクト同士を比較する方法についてまとめる。
1.オブジェクト同士の同値性を確かめる
2.オブジェクト同士の同一性を確かめる
3.ハッシュのkeyとvalue両方の同値性を確かめる
4.正規表現と文字列がマッチしているかいないかを確かめる
5.ふたつのオブジェクトの大小や順番を比較する
1. オブジェクト同士の同値性を確かめる
オブジェクトの同値性とは、オブジェクトが同じでも、別々でもよく、ただ値が等しいことを意味する。この同値性を確かめるには、== を使う。
str1= str2 = String.new"hoge" str3 = String.new"hoge" str4= String.new"fuga" #== を使って比較する str1 == str2 #=> true(オブジェクトが等しい場合) str1 == str3 #=> true(値のみ等しい場合) str1 == str4 #=> false(値が異なる場合)
多くのクラスで同値性は==で確かめられるが、例外として、Objectクラスにおいて、==は、equal?と同義で使われ、オブジェクトの同一性を判定するのに用いられる。
他にも、異値性を確かめる演算子として、!=がある。!=は、==がtrueを返すとき、falseを返し、==がfalseを返すとき、trueを返す。
2.オブジェクト同士の同一性を確かめる
オブジェクト同士の同一性とは、すなわち、オブジェクトが等しいということである。
これには、equal?メソッドが用いられる。
str1= str2 = String.new"hoge" str3 = String.new"hoge" str4= String.new"fuga" #== を使って比較する str1.equal? str2 #=> true(オブジェクトが等しい場合) str1.equal? str3 #=> false(値のみが等しい場合) str1.equal? str4 #=> false(値が異なる場合)
equal?メソッドは、オブジェクトクラスのもので、オブジェクトの同一性を確かめるメソッドとして、いかなるサブクラスによってoverrideされるべきではないとされている。
同一性を確かめる手段として、他にも、object_idを比較する方法もある。
str1= str2 = String.new"hoge" str3 = String.new"hoge" str4= String.new"fuga" #== を使って比較する str1.object_id == str2.object_id #=> true(オブジェクトが等しい場合) str1.object_id == str3.object_id #=> false(値のみが等しい場合) str1.object_id == str4.object_id #=> false(値が異なる場合)
3. ハッシュのkeyとvalue両方の同値性を確かめる
これには、eql?メソッドを使う。
このメソッドはハッシュのkeyとvalue両方にeql?メソッドを用い、比較する。
hash1 = { :a => 1, :b => 2 } hash2 = { :a => 1.0, :b => 2 } hash1 == hash2 #=> true hash1.eql(hash2) #=>false #Numelicクラスに対して、eql?メソッドは、floatとintegerを比較する場合、同値性を認めない
4. 正規表現と文字列がマッチしているかいないかを確かめる
正規表現(Regexp)と文字列(String)のパータンマッチがあるか否かを確認するには、=~, !~を使う。!~ 演算子は =~ 演算子が偽 (nil または false) を返す場合は true を返し、それ以外の場合は false を返す。
/pencil/ =~ "I have a pencil." #=> true /eraser/ =~ "I have a pencil." #=> false /pencil/ !~ "I have a pencil." #=> false /eraser/ !~ "I have a pencil." #=> true
5.ふたつのオブジェクトの大小や順番を比較する
オブジェクトの大小を比較する際に用いるのは、Comparableのメソッドの<. >, <=, >=を用いる。
順に、<は左辺が小さい、>は左辺が大きい、<=は左辺が小さいもしくは同じ、>=は左辺が大きいもしくは同じである場合にtrueを返す。
1 < 2 #=>true 2 > 1 #=>true 1 <= 2 #=>true 2 >= 1 #=>true
さらに、比較するふたつのオブジェクトのうちどちらが大きいか、もしくは、同じかを確認したい場合は、<=>を用いる。
左辺が小さい場合、-1を返し、左辺が大きい場合、1を返し、両辺が同値の場合、nilを返す。
1 <=> 2 #=> -1 2 <=> 1 #=> 1 1 <=> 1 #=> nil
以上