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

相关文章
相关标签/搜索