Ruby中的各類比較方式對比

Ruby中設計了不少種比較方式,全部對象都能進行==、!=、===、<=>、eql?、equal?這幾種比較。此外,當實現了<=>以後,若是還include了Comparable以後,就會自動得到<=、<、==、>=、>、between?這幾個比較方法。設計

這些比較方法的定義位置和意義分別以下。code

在BasicObject中定義了對象

  • ==:比較內容是否相同,更多時候是描述二者是否相等,好比1.0 == 1的內容是不一樣的,可是相等
  • !=:和==是相反的
  • equal?:比較對象是不是同一對象,即內存地址是否相同。是最嚴格的,不該該隨意重寫這個方法

在Object中定義了blog

  • <=>:對於Object的<=>來講,它判斷兩值是否相等(經過==比較),若是相等則返回0,若是不等則返回nil。可是,若是重寫這個方法,應當以下設計:
    • 比較兩個值的大小,左邊大於右邊返回1,等於(經過==比較)返回0,左邊小於右邊返回-1
    • 若是不可比較,則返回nil
  • ===:智能比較符號。若是某個類沒有重寫這個方法(即繼承Object的===),那麼它等價於==,若是重寫了,則根據重寫規則來判斷。一般用於如下幾種判斷:
    • Array和String沒有實現===,因此這兩個類中的===等價於==的行爲
    • 對於Range的行爲,所定義的是某對象是否在某個Range範圍內
    • 對於Module的行爲,所定義的是某對象是不是某模塊的實例或後裔
    • 對於Regexp的行爲,所定義的是某對象是否能匹配給定模式,等價於=~
    • 因此總結起來,若是定義了===,那麼它大概是用來作成員所屬判斷的
  • eql?:對二者計算hash值,比較hash值是否相同。因此, 極可能是用來描述內容是否徹底一致的判斷,好比(1.0).eql?(1)是false

因此,對於等同性比較來講,它們嚴格度來講:==要比eql?寬鬆,eql?要比equal?寬鬆。繼承

相關文章
相關標籤/搜索