Ruby: 4種類の同等性比較: equal?/eql?/==/===(翻訳)

概要 原著者の許諾を得て翻訳・公開いたします。 英語記事: Idiosyncratic Ruby: Struggling Four Equality 原文更新日: 2017/12/25 著者: Jan Lelis サイト: Idiosyncratic Ruby Ruby: 4種類の同等性比較: equal?/eql?/==/===(翻訳) Rubyのさらなる特異な性質として、同等性の比較があります。さほど複雑ではありませんが、名前に注意しましょう。 同等性比較の4つの概念 1. equal?: オブジェクトの同一性比較 これはわかりやすい概念です。x.object_id == y.object_idのように、2つのオブジェクトが完全に同一であるべきだと考えられます。 2. ==(ダブルイコール): 「同等性」の同等性 これは大抵の場合注意が必要です。2つのオブジェクトは同じとして扱われるべきです。そのクラスで<=>ロケット比較演算子がサポートされている場合、==が同じ2つの値についてtrueを返すことが期待されているならば<=>は0を返します。 3. eql?: ハッシュキーの同等性 これは通常==と同じ動作です。eql?は普通オーバーライドされた==メソッドのエイリアスです。 eql?の最も重要な効果は、ハッシュキーを区別するときに発揮されます。ドキュメントには以下のように書かれています。 hash値が同一かつ2つのオブジェクトが互いにeql?の場合、2つのオブジェクトは同じハッシュキーを参照する。 次は現実的な例です。 1 == 1.0 # => true 1.eql?(1.0) # => false # すなわち以下の2つは異なるキーとして扱われる {1: “Idiosyncratic”, 1.0 “Hash”} つまりeql?は==より少しばかり厳格です。2つのオブジェクトが同一クラスのインスタンス同士でない場合はfalseを返すためです。典型的な実装は以下のようになります。 def eql?(other) instance_of?(other.class) … Continue reading Ruby: 4種類の同等性比較: equal?/eql?/==/===(翻訳)