Ruby中設計了不少種比較方式,全部對象都能進行==、!=、===、<=>、eql?、equal?
這幾種比較。此外,當實現了<=>
以後,若是還include了Comparable以後,就會自動得到<=、<、==、>=、>、between?
這幾個比較方法。設計
這些比較方法的定義位置和意義分別以下。code
在BasicObject中定義了:對象
==
:比較內容是否相同,更多時候是描述二者是否相等,好比1.0 == 1
的內容是不一樣的,可是相等!=
:和==
是相反的equal?
:比較對象是不是同一對象,即內存地址是否相同。是最嚴格的,不該該隨意重寫這個方法在Object中定義了:blog
<=>
:對於Object的<=>
來講,它判斷兩值是否相等(經過==
比較),若是相等則返回0,若是不等則返回nil。可是,若是重寫這個方法,應當以下設計:
==
比較)返回0,左邊小於右邊返回-1===
:智能比較符號。若是某個類沒有重寫這個方法(即繼承Object的===
),那麼它等價於==
,若是重寫了,則根據重寫規則來判斷。一般用於如下幾種判斷:
===
,因此這兩個類中的===
等價於==
的行爲=~
===
,那麼它大概是用來作成員所屬判斷的eql?
:對二者計算hash值,比較hash值是否相同。因此, 極可能是用來描述內容是否徹底一致的判斷,好比(1.0).eql?(1)
是false因此,對於等同性比較來講,它們嚴格度來講:==
要比eql?
寬鬆,eql?
要比equal?
寬鬆。繼承