Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

同等性を実装してRubyで2つのオブジェクトを比較する方法

平等とは、2つのことが同じであることを意味します。 Rubyでは、オブジェクトとその値を比較して、それらが同じオブジェクトであるかどうかを確認します。

質問は…

Rubyで2つのことをどのように比較しますか?

このように

1 == 1

# true

あなたはおそらくこれにすでに精通しているでしょう…

しかし、==であることをご存知でしたか 構文だけでなくメソッドですか?

影響は大きいです。

このメソッドを独自のクラスに実装して、クラスをより強力にすることができます。そして、それがこの投稿で学ぶことです!

2つのオブジェクトを同じにする理由

次のように2つの文字列を比較できます:

"foo" == "foo"

単語と文字の場合 同じなら、同じです。

式はtrueを返します 。

これは、Stringが機能するために機能します クラスは==を実装します (2つの等号)文字列を比較する方法を知っている方法。

しかし、Stringの場合はどうなりますか? ==を実装しませんでした ?

次に、RubyはObjectを使用します の==の実装 、デフォルトでは、オブジェクトの内容ではなく、オブジェクトのIDをテストします。

Object.new == Object.new # false
String.new == String.new # true

Objectの理由 falseを返します 2つの新しいオブジェクトのオブジェクトIDが異なるためです。

Stringの場合 、内容に基づいて比較し、2つの新しい文字列が同じ内容(空)であるため、trueを返します。 。

平等の実施

次に、学習した内容を使用して、クラスを比較できるようにすることで、独自のクラスをより強力にします。

==に感謝します メソッド…

自分のクラスの2つのインスタンスが等しいことの意味を正確に定義できます。

class Product
  attr_reader :name, :price

  def initialize(name, price)
    @name, @price = name, price
  end

  def ==(other)
    self.name  == other.name &&
    self.price == other.price
  end
end

p1 = Product.new('book', 49)
p2 = Product.new('book', 49)

p1 == p2 # true

== メソッドは、名前と価格の両方が2つのProductで同じでなければならないことを示しています 等しいと見なされるオブジェクト。

覚えておいてください

このメソッドを実装しない場合(またはComparableを使用する場合 モジュール(Rubyの本で説明しています)2つのオブジェクトは、値ではなくオブジェクトIDを使用して比較されます。

また、Structを使用する場合は、すでに==が実装されていることにも言及しておく必要があります。 あなたのために。

トリプルイコールはどうですか?

==かどうか疑問に思われるかもしれません はメソッドであり、は=== また方法?そして答えはイエスです🙂

では、この2つの違いは何ですか?

Javascriptには明らかな違いがあり、== オブジェクトタイプが同じでない場合は、同じになるように変換しようとします(1 vs '1' )。そして=== 「厳密な」平等のためです。

しかし、Rubyにはそのようなことはありません。 ===とは つまり、それを実装するクラスによって異なります。

多くの場合、これは==の単なるエイリアスです。 。

Stringのように およびObject

===を提供する組み込みクラスの表を次に示します。 特別な意味:

クラス 意味 範囲 正規表現を文字列と照合します。 モジュール
objが範囲の要素である場合はtrueを返し、そうでない場合はfalseを返します。
正規表現
objがmodのインスタンス、またはmodの子孫の1つのインスタンスである場合はtrueを返します。
手順 Proc#callのように、procのパラメータとしてobjを使用してブロックを呼び出します 。これは、procオブジェクトをwhenのターゲットにできるようにするためです。 caseステートメントの句。

結論

この投稿では、==を実装してクラスをより強力にする方法を学びました。 方法。 ==の違いも学びました および===

この投稿を共有することを忘れないでください より多くの人がそれを見ることができます🙂


  1. iPhone / iOSで2つのNSDateを比較するにはどうすればよいですか?

    この記事では、2つのNSDateをすばやく比較する方法を説明します。まず、2つのNSDateを作成する必要があります。 今回はシミュレーターではなく遊び場で行います。 まず、2つの異なる日付を作成しましょう。 let dateOne = NSDateComponents() dateOne.day = 5 dateOne.month = 6 dateOne.year = 1993 let dateTwo = NSDateComponents() dateTwo.day = 4 dateTwo.month = 2 dateTwo.year = 1995 これらの日付コンポーネントを使用して、

  2. Ruby Freezeメソッド–オブジェクトの可変性を理解する

    オブジェクトが可変であるとはどういう意味ですか? 派手な言葉で混乱させないでください。「可変性 」は、オブジェクトの内部状態を変更できることを意味します。これは、凍結されたオブジェクトを除く、すべてのオブジェクトのデフォルトです。 、または特別なオブジェクトのリストの一部であるもの。 つまり、Rubyのすべてのオブジェクトが変更可能というわけではありません! 例 : 数字や記号、さらにはtrueには意味がありません またはfalse (オブジェクトでもあります)変更します。 数字の1は常に1になります。 ただし、他のオブジェクト、特に配列オブジェクトやハッシュオブジェクトなどのデー