そしてこれは、そのシンプルさと優雅さで有名な自慢のルビーです。 何が何で、なぜそんなに多くの機能が必要なのかを考えてみましょう。 検証のために、次のオブジェクトを使用します。
string = "some string" same_string = string copy_string = "some string" int = 7 same_int = int copy_float = 7.0 new_int = 7 class TestClass def initialize(content) @content = content end end class SubTestClass < TestClass def initialize(content) super(content) end end test_obj = TestClass.new("something") same_obj = test_obj new_obj = TestClass.new("something") sub_obj = SubTestClass.new("something")
1. equal?()メソッド
おそらく最も簡単な方法です。 Objectクラスで定義され、子クラスで書き換えることはできません(判明したとおり、書き換えることはできますが、 まったくお勧めできません !)。 彼が行うことは、変数が同じオブジェクトを指しているかどうかを確認することだけです。
私たちはチェックします:
puts string.equal?(same_string) #true, , puts string.equal?(copy_string) #false, puts int.equal?(same_int) #true, puts int.equal?(copy_float) #false 7 7.0 - puts int.equal?(new_int) #true, Fixnum , # object_id . , , new_int, int puts test_obj.equal?(same_obj) #true, puts test_obj.equal?(new_obj) #false, , puts test_obj.equal?(sub_obj) #false, ,
さて、ここではすべてが明確になっています。次の方法に移ります。
2. eql?()メソッド
Objectクラスでも定義されています。 equal?()と同じように機能しますが、サブクラス(特にすべての数値と文字列)で再定義されます-オブジェクトの値が同じ場合はtrueを返しますが、同じクラスに属しているかどうかもチェックします。 Hashクラスによって使用されます。
puts string.eql?(same_string) #true, , puts string.eql?(copy_string) #true, - puts int.eql?(same_int) #true, equal? , eql? puts int.eql?(copy_float) #false, , puts int.eql?(new_int) #true, , , puts test_obj.eql?(same_obj) #true, , puts test_obj.eql?(new_obj) #false, !, eql? Object, # equal? puts test_obj.eql?(sub_obj) #false, , ,
3. ==
クラスレベルで、Objectは同等と同じことを行いますか?(もう一度!)つまり、変数が1つのオブジェクトを指すかどうかをチェックしますが、サブクラス(特に、数値と文字列)の動作は異なるように書き換えられます-値のみがチェックされ、1つに属する必要はありませんクラス(数値用)、eqlとの違いは何ですか?..
puts string == (same_string) #true, puts string == (copy_string) #true, puts int == (same_int) #true, puts int == (copy_float) #true, - , puts int == (new_int) #true, #! == , #Object, equal? puts test_obj == (same_obj) #true puts test_obj == (new_obj) #false puts test_obj == (sub_obj) #false
4. ===
===の結果は、==の結果とまったく同じです(文字列と正規表現に「but」が1つあります)。 トリプルイコールの最も一般的な使用方法は、ご想像のとおり、文字列と正規表現を比較するケースコンポーネントです。
ここで紹介する唯一の例は次のとおりです。
puts /p.*cock/ == 'peacock' #false, == , puts /p.*cock/ === 'peacock' #true, ===
それが唯一の小さな違いです。
結論:
ほとんどの場合、2つのメソッド-equal?()And ==のみを使用します。 主なことは、等しいことを覚えていることですか?()常に(!)そして、繰り返しますが、常に、変数が1つのオブジェクトを指しているかどうかのみをチェックします。
==は同じことをします。 しかし、純粋に直感的なレベルでは、Fixnum、String、Floatなどの単純なデータ型ではdoubleが等しいことは明らかです。最も頻繁に使用するデータ型では、値の等価性のみをチェックする必要があります。 だからこそ、==はそのように書き直されました。 また、クラスを開発するときは、==をオーバーライドして内容のみをチェックすることをお勧めします。
eql? Hashクラスで使用されますが、通常のプログラマーには特に必要ありません。 唯一のことは、1つのクラスに属しているかどうかをチェックすることで、単純な型(この関数がオーバーライドされる)の==機能を拡張したい場合、eqlを使用できますか?
===に関しては、この関数が大部分のケースコントロールに実装されているため、めったに使用されません。 ただし、正規表現と文字列を比較する必要がある場合(=〜以外の何かを使用しますが、なぜですか?)、トリプルイコールはここで役立ちます。