🎯

【Ruby】equal? eql? == の違い

2024/07/01に公開

雑な僕の覚え方

  • ==は、一般的なイコールのイメージ通りに、内容を比較する。
  • eql?は文字数が短いから、ざっくり調べる(オブジェクトの内容と型)。
  • equal?は文字数が長いから、ちゃんと調べる(オブジェクトID)。

equal?

equal?メソッドは、2つのオブジェクトが同一のオブジェクトIDを持つかどうかを比較します。これは、オブジェクトが完全に同じ場合にのみtrueを返します。異なるオブジェクトが同じ内容を持っていても、オブジェクトIDが異なればfalseとなります。例えば、以下のようなシーンで使用されます。

a = "hello"
b = "hello"
c = a

puts a.equal?(b)   # => false(異なるオブジェクト)
puts a.equal?(c)   # => true(同じオブジェクト)

この例では、aとbは同じ文字列を持っていますが、異なるオブジェクトなのでfalseを返します。一方、aとcは同じオブジェクトを指しているのでtrueを返します。equal?メソッドは、パフォーマンスの最適化やメモリ管理のために、オブジェクトが同一であるかを確認する際によく使用されます。例えば、同一のオブジェクトであれば重複した計算や処理を避けることができ、メモリの重複使用を防ぐことができます。

eql?

eql?メソッドは、オブジェクトの内容と型が同じかどうかを比較します。このメソッドは、特にハッシュキーの比較や集合演算で使用されることが多いです。異なる型のオブジェクトはfalseとなります。以下の例を参照してください。

a = 1           # => Integer型
b = 1.0         # => Float型
puts a.eql?(b)  # => false(異なる型)

この例では、aは整数で、bは浮動小数点数なので、内容が同じであってもfalseを返します。eql?メソッドは、ハッシュのキーとして使用するオブジェクトが同じ内容と型を持つかどうかを確認する際に役立ちます。また、集合データ構造で要素の一意性を確認するためにも使用されます。例えば、ハッシュマップのキーとしてeql?を使ってオブジェクトを比較することで、異なる型のキーが誤って同一視されることを防ぐことができます。

==

==メソッドは、2つのオブジェクトの内容が同じかどうかを比較します。これは、異なる型のオブジェクトであっても、その内容が等しければtrueを返します。例えば、以下のように使用されます:

a = 1           # => Integer型
b = 1.0         # => Float型

puts a == b     # => true(数値的に同じ値)

この例では、aとbは異なる型ですが、数値的には同じ値を持っているためtrueを返します。==メソッドは、数値や文字列の比較に頻繁に使用されます。例えば、異なる型の数値であっても、値が等しいかどうかを確認する場合や、異なるオブジェクトであっても文字列内容が同じであれば等しいと判断する場合に役立ちます。

FAQ

オブジェクトIDとは何?

オブジェクトIDは、Rubyインタプリタがオブジェクトを一意に識別するために使用する識別子です。オブジェクトがメモリ内に存在する限り、そのオブジェクトIDは一意であり、同じオブジェクトが異なるオブジェクトIDを持つことはありません。object_idメソッドを使ってオブジェクトのIDを取得することができます。

a = "hello"
puts a.object_id  # => 70138229395480(例)

オブジェクトの内容とは?

オブジェクトの内容とは、オブジェクトが保持するデータのことです。例えば、文字列オブジェクトの内容はその文字列自体、配列オブジェクトの内容はその配列に含まれる要素です。以下の例では、文字列オブジェクトの内容として「hello」が含まれています。

a = "hello"
puts a           # => hello

オブジェクトの型とは?

オブジェクトの型とは、オブジェクトのクラスのことです。型はオブジェクトがどのようなデータを持ち、どのようなメソッドを使用できるかを定義します。Rubyでは、classメソッドを使ってオブジェクトの型を確認することができます。

a = "hello"
puts a.class     # => String

b = 1
puts b.class     # => Integer

参考

https://qiita.com/miyaki2003/items/c878959da5e500768c1a
https://shou2017.com/post/2018/0513_rubyexam_eql_equal/

Discussion