equal?, ==, eql?, ===の違いを解説
この記事は下記のような人を対象にしています。
- 駆け出しRubyエンジニア
- プログラミング初学者
結論
equal・・・同じobject_idの場合にtrueを返す
== ・・・人の目で見て自然であればtrueを返す
eql・・・同じクラスで中身も同じならtrue、中身が同じでも別クラスだったらfalseを返す
=== ・・・case文のwhen節で暗黙的に使われている
equal?
equal?メソッドは、同じobject_idの場合にtrueを返します。
a = "apple"
b = "apple"
a.equal?(b)
=> false
文字列の内容が同じappleなのに、falseなのは、aとbそれぞれが持つobject_idが異なるから。
では、object_idとは??
オブジェクトにランダムに割り当てられる、重複しない整数のこと!
Rubyでは、重複しない整数が、各オブジェクトに1つずつ割り当てられています。
各オブジェクトに対して一意な整数を返します。あるオブジェクトに対してどのような整数が割り当てられるかは不定です。
a.object_id
=> 76740
b.object_id
=> 92660
一方で、変更できないImmutable(変更不可)なオブジェクトの一部は、同じ内容ならば必ず同じobject_idを返します。↓
TrueClass, FalseClass, NilClass, Symbol, Integer クラスのインスタンス。
==
==はオブジェクトの内容が等しいかどうかを判断します。
当然以下はtrueになります。
"apple" == "apple"
=> true
さらに、データ型が違っても、人の目で見て自然であればtrueを返すことがあります。
1はinteger(整数型)、1.0はfloat(浮動小数点数型)
1 == 1.0
=> true
eql?
クラスによっては、==よりも厳しい等値判定をします。
1.eql?(1.0)
=> false
同じクラス同士、つまりintegerはinteger、floatならfloat同士でしかtrueを返さないのです。
1.eql?(1)
=> true
1.0.eql?(1.0)
=> true
eql?は、ハッシュキーを区別するときに利用されます。
1.hash
=> 928416955
1.0.hash
=> 952311353
# 1と1.0は別のハッシュ値になるため、それぞれ異なるキーとして扱われる
{1 => "James", 1.0 => "Steph"}
ハッシュ値とは、あるデータから特定の計算手順によって求められる、一見ランダムな整数値のこと。
===
===(トリプルイコール)は、case文のwhen節で暗黙的に使われています。
以下のコードの内部的には、
String === value
Array === value
Hash === value
の結果が評価されています。
value = {
"red" => "apple",
"yellow" => "pineapple",
"blue" => "blueberry"
}
case value
when String
puts "文字列です"
when Array
puts "配列です"
when Hash
puts "ハッシュです"
end
#=>ハッシュです
おわりに
今回はrubyの等値を判断するメソッドや演算子をまとめてみました。
この記事が、rubyの初学者の方や、ruby silverの受験を考えている方達に、少しでもお役に立てたら幸いです!!
参考