2011-07-14 89 views
0

兩個物體怎麼可能是相同的但不是?Ruby類似乎是相同的,但並不相同

有運行代碼pickle_step 「的典範!(老闆)。發送(協會)。應該==模型!(目標)」

當一個標籤(黃瓜--tags @thisonescenario)運行,所有者和目標是相同的,測試通過。

當運行其餘場景(黃瓜)時,所有者和目標不一樣。

經過檢查(rdebug)後,代碼表示這些類雖然看起來好像不一樣。黃瓜步驟的輸出如下:

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

注:==重載通過蒙戈庫以下代碼:

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

的_id比較爲真。 self.class == other.class是錯誤的。

檢查類屬性,如後代,祖先等顯示它們是相同的。

任何想法?

+0

謝謝你的信息。這是我對堆棧溢出如何工作的一個誤解。我已經經歷了並接受了答案。 – ehsk

+0

很酷,現在'self.class == other.class'應該將'self.class.object_id'與'other.class.object_id'進行比較 - 你可以在調試/測試中輸出它們,看看它們是否是相同? – smathy

+0

Ya。在運行所有場景時這些不同,但只運行一種場景時情況相同。另外,做一個self.class.ancestors和other.class.ancestors會顯示一個不同的模塊(這看起來像一些隨機ID:例如,#),所以至少我現在可以看到它們實際上是不同的。感謝提示。更快速的方式來看看對象是否完全相同。 – ehsk

回答

0

如果您使用===而不是==來比較類名?

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

這也可以匹配子類,雖然可能需要但功能不同。 – Chuck

+0

我嘗試過,但結果是所有對象比較失敗。 think ===不僅僅是比較和改變它的行爲不僅僅是因爲超載,而是因爲語言的使用(例如case case語句) 作爲一個例子,你可以做(​​1..5)=== 3這是真的意味着3是在5中。我相信===運算符也是紅寶石中Case語句的底層運算符 其他示例 a =「你好」 a.class === a => a.is_a?(a) b =「你好」 a === b爲真 a.class === b.class爲false => a.class.is_a?(b.class) 但a.class == b.class爲true – ehsk

相關問題