亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

equ?,eql?,===和==之間有什么區別?

equ?,eql?,===和==之間有什么區別?

絕地無雙 2019-07-27 14:52:26
equ?,eql?,===和==之間有什么區別?我試圖理解這四種方法之間的區別。我知道默認情況下==調用的方法equal?在兩個操作數引用完全相同的對象時返回true。===默認情況下也會調用==哪個調用equal?...好吧,如果所有這三個方法都沒有被覆蓋,那么我想===,==并equal?做同樣的事情?現在來了eql?。這是做什么的(默認情況下)?它是否調用操作數的hash / id?為什么Ruby有這么多的平等標志?他們應該在語義上有所不同嗎?
查看完整描述

3 回答

?
慕的地8271018

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級別,==僅當objother是同一對象時才返回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

請參閱我的答案,以獲得一個簡潔的例子,說明caseRegex如何使代碼更清晰。當然,通過提供自己的===實現,您可以獲得自定義case語義。

eql?Hash平等

eql?如果obj并且other引用相同的散列鍵,則該方法返回true 。這用于Hash測試成員是否相等。對于類的對象Objecteql?是同義詞==。子類通常通過eql?對其重寫==方法進行別名來繼續這種傳統,但也有例外。Numeric例如,類型執行跨越==但不跨越的類型轉換eql?,因此:

1 == 1.0     #=> true1.eql? 1.0   #=> false

因此,您可以自由地覆蓋它以供自己使用,或者您可以覆蓋==和使用,alias :eql? :==因此這兩種方法的行為方式相同。

equal? - 身份比較

與此不同==,該equal?方法永遠不應被子類覆蓋:它用于確定對象標識(即a.equal?(b)iff a與其相同的對象b)。

這實際上是指針比較。


查看完整回答
反對 回復 2019-07-27
  • 3 回答
  • 0 關注
  • 1079 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號