2011-07-14 4 views
0

2つのオブジェクトはどのようにして同じに見えますが、そうではありませんか?Rubyクラスは同じだと思われますが、等価とは見なされません

コード実行しますpickle_step持っている "モデルを!(所有者).send(関連).should ==モデル!(ターゲット)"

タグで実行(キュウリ--tags @thisonescenario)、所有者とターゲットは同じで、テストに合格します。

残りのシナリオ(キュウリ)で実行した場合、オーナーとターゲットは同じではありません。

検査(rdebug)の後、コードは、実際にはそうであってもクラスが同じではないことを示しています。次のようにキュウリステップの出力は、次のとおりです。

expected: #<Content _id: content_1, _type: nil> 
     got: #<Content _id: content_1, _type: nil> (using ==) 
    Diff: (RSpec::Expectations::ExpectationNotMetError) 

注:==以下のコードでMongoのライブラリで、オーバーロード:

def ==(other) 
    self.class == other.class && 
    attributes["_id"] == other.attributes["_id"] 
end 

_id比較が真です。 self.class == other.classはfalseです。

子孫、祖先などのクラスプロパティの検査は同じであることがわかります。

アイデア?

+0

よう

何かの情報をいただき、ありがとうございます。私はスタックオーバーフローの仕組みについて誤解していました。私は行って、受け入れる答えの事をしました。 – ehsk

+0

クールで、 'self.class == other.class'は' self.class.object_id'と 'other.class.object_id'を比較するべきです - それらをデバッグ/テストで出力し、それらが同じ? – smathy

+0

それらはすべてのシナリオを実行するときに異なりますが、1つのシナリオだけを実行する場合も同じです。 #<モジュール:0x00000105a11fe8>また、self.class.ancestorsとother.class.ancestorsを行うと、いくつかのランダムな番号のように思える異なるモジュール(示しています。たとえばだから、少なくとも私は今、彼らは実際に異なっていることがわかります。先端をありがとう。オブジェクトがまったく同じかどうかを確認するために迅速な方法。 – ehsk

答えて

0

===代わりに==を使用してクラス名を比較するとどうなりますか?

other === self && ... 
+0

もおそらく望ましいものの、機能的に異なっている、サブクラスに一致します。 – Chuck

+0

私はこれを試してみましたが、結果はすべてのオブジェクトの比較は失敗しました。I考える=== ===だけで比較するよりも多くを行い、それがbeahaviorないという理由だけでオーバーロードされているのですが、変更するために、言語の使用方法(例えばcase文)。例として 、あなたは(1..5)を行うことができます3 3を意味している真である5で、私は===演算子はまた、Rubyでcase文の基礎となる演算子であるbelieven。 他の例である"Hello" a.class === a.is_a?(a) b = "Hello" a === bが真である a.class === b.classがfalseです=> a.class.is_a?(b.class) しかしa.class == b.classは真です – ehsk

関連する問題