同等性を実装して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ステートメントの句。 |
結論
この投稿では、==を実装してクラスをより強力にする方法を学びました。 方法。 ==の違いも学びました および=== 。
この投稿を共有することを忘れないでください より多くの人がそれを見ることができます🙂
-
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 これらの日付コンポーネントを使用して、
-
Ruby Freezeメソッド–オブジェクトの可変性を理解する
オブジェクトが可変であるとはどういう意味ですか? 派手な言葉で混乱させないでください。「可変性 」は、オブジェクトの内部状態を変更できることを意味します。これは、凍結されたオブジェクトを除く、すべてのオブジェクトのデフォルトです。 、または特別なオブジェクトのリストの一部であるもの。 つまり、Rubyのすべてのオブジェクトが変更可能というわけではありません! 例 : 数字や記号、さらにはtrueには意味がありません またはfalse (オブジェクトでもあります)変更します。 数字の1は常に1になります。 ただし、他のオブジェクト、特に配列オブジェクトやハッシュオブジェクトなどのデー