1
0

Rubyの等値を判断するメソッド・演算子の理解[equal?, ==, eql?, ===]の違い

Posted at

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の受験を考えている方達に、少しでもお役に立てたら幸いです!!

参考

プロを目指す人のためのRuby入門[改訂2版] 

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0