3 回答

TA貢獻1796條經驗 獲得超4個贊
我將在這里大量引用Object文檔,因為我認為它有一些很好的解釋。我鼓勵你閱讀它,以及這些方法的文檔,因為它們在其他類中被覆蓋,比如String。
旁注:如果您想在不同的對象上嘗試這些,請使用以下內容:
class Object def all_equals(o) ops = [:==, :===, :eql?, :equal?] Hash[ops.map(&:to_s).zip(ops.map {|s| send(s, o) })] endend"a".all_equals "a" # => {"=="=>true, "==="=>true, "eql?"=>true, "equal?"=>false}
==
- 通用“平等”
在Object級別,
==
僅當obj
且other
是同一對象時才返回true 。通常,在子類中重寫此方法以提供特定于類的含義。
這是最常見的比較,因此是您(作為一個類的作者)決定兩個對象是否“相等”的最基本的地方。
===
- 案件平等
對于類Object,實際上與調用相同
#==
,但通常由后代重寫,以在case語句中提供有意義的語義。
這非常有用。有趣===
實現的事情的例子:
范圍
正則表達式
Proc(在Ruby 1.9中)
所以你可以這樣做:
case some_objectwhen /a regex/ # The regex matcheswhen 2..4 # some_object is in the range 2..4when lambda {|x| some_crazy_custom_predicate } # the lambda returned trueend
請參閱我的答案,以獲得一個簡潔的例子,說明case
+ Regex
如何使代碼更清晰。當然,通過提供自己的===
實現,您可以獲得自定義case
語義。
eql?
- Hash
平等
eql?
如果obj
并且other
引用相同的散列鍵,則該方法返回true 。這用于Hash
測試成員是否相等。對于類的對象Object
,eql?
是同義詞==
。子類通常通過eql?
對其重寫==
方法進行別名來繼續這種傳統,但也有例外。Numeric
例如,類型執行跨越==
但不跨越的類型轉換eql?
,因此:1 == 1.0 #=> true1.eql? 1.0 #=> false
因此,您可以自由地覆蓋它以供自己使用,或者您可以覆蓋==
和使用,alias :eql? :==
因此這兩種方法的行為方式相同。
equal?
- 身份比較
與此不同
==
,該equal?
方法永遠不應被子類覆蓋:它用于確定對象標識(即a.equal?(b)
iffa
與其相同的對象b
)。
這實際上是指針比較。
- 3 回答
- 0 關注
- 1079 瀏覽
添加回答
舉報