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?
宽松。继承