ハッカーを目指す白Tのブログ

夏は白のTシャツを着ています。ラジオが好きです。(ラジオネーム: 隠れキリジダン)

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 

以上