Ruby中设计了很多种比较方式,所有对象都能进行==、!=、===、<=>、eql?、equal?这几种比较。此外,当实现了<=>之后,如果还include了Comparable之后,就会自动获得<=、<、==、>=、>、between?这几个比较方法。

这些比较方法的定义位置和意义分别如下。

在BasicObject中定义了

  • ==:比较内容是否相同,更多时候是描述两者是否相等,比如1.0 == 1的内容是不同的,但是相等
  • !=:和==是相反的
  • equal?:比较对象是否是同一对象,即内存地址是否相同。是最严格的,不应该随意重写这个方法

在Object中定义了

  • <=>:对于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?宽松。

Ruby中的各种比较方式对比的更多相关文章

  1. Android自动化测试中AccessibilityService获取控件信息(2)-三种方式对比

    Android自动化测试中AccessibilityService获取控件信息(2)-三种方式对比   上一篇文章: Android自动化测试中AccessibilityService获取控件信息(1 ...

  2. Spring core resourc层结构体系及JDK与Spring对classpath中资源的获取方式及结果对比

    1. Spring core resourc层结构体系 1.1. Resource相关结构体系 1.2. ResourceLoader相关体系 2. JDK与Spring对classpath中资源的获 ...

  3. sql server查询可编程对象定义的方式对比以及整合

    本文目录列表: 1.sql server查看可编程对象定义的方式对比 2.整合实现所有可编程对象定义的查看功能的存储dbo.usp_helptext2 3.dbo.helptext2的选择性测试 4. ...

  4. [翻译]理解Ruby中的blocks,Procs和lambda

    原文出处:Understanding Ruby Blocks, Procs and Lambdas blocks,Procs和lambda(在编程领域被称为闭包)是Ruby中很强大的特性,也是最容易引 ...

  5. 理解Ruby中的作用域

    作用域对于Ruby以及其它编程语言都是一个需要理解的至关重要的基础知识.在我刚开始学习ruby的时候遇到很多诸如变量未定义.变量没有正确赋值之类的问题,归根结底是因为自己对于ruby作用域的了解不够, ...

  6. [No000010]Ruby 中一些百分号(%)的用法小结

    #Ruby 中一些百分号(%)的用法小结 #这篇文章主要介绍了Ruby 中一些百分号(%)的用法小结,需要的朋友可以参考下 what_frank_said = "Hello!"#% ...

  7. Ruby中Block, Proc, 和Lambda

    Block Blocks就是存放一些可以被执行的代码的块,通常用do...end 或者 {}表示 例如: [1, 2, 3].each do |num| puts num end [1, 2, 3]. ...

  8. C# & SQL Server大数据量插入方式对比

    以下内容大部分来自: http://blog.csdn.net/tjvictor/article/details/4360030 部分内容出自互联网,实验结果为亲测. 最近自己开发一个向数据库中插入大 ...

  9. ruby中symbol

    Symbol 是什么 Ruby 是一个强大的面向对象脚本语言(本文所用 Ruby 版本为1.8.6),在 Ruby 中 Symbol 表示“名字”,比如字符串的名字,标识符的名字. 创建一个 Symb ...

随机推荐

  1. python下载图片(3)

    # -*- coding: utf-8 -*-"""some function by metaphy,2007-04-03,copyleftversion 0.2&quo ...

  2. OpenGL(十八) 顶点数组和抗锯齿(反走样)设置

    顶点数组函数可以在一个数组里包含大量的与顶点相关的数据,并且可以减少函数的调用.使用顶点数组需要先启用顶点数组功能,使用glEnableClientState函数启用顶点数组,参数可以是GL_VERT ...

  3. [视频]mac系统下虚拟机parallels安装ubuntu 14.04视频教程

    此文是http://www.mr-wu.cn/install-ubuntu-14-04-on-parallels-for-mac/这篇博文的补充,为整个ubuntu 14.04安装过程的视频录像. m ...

  4. mac 端安装JAVA开发环境

    一.maven安装 下载地址   https://maven.apache.org/download.cgi 下载 apache-maven-3.5.2-bin-zip 将下载的文件放在某路径下 修改 ...

  5. Java之线程池管理

    JDK5后建议使用ExecutorService与Excutors来创建与管理线程池, 不再建议直接使用Thread. 开始不明白原因, 今天知道结果了:使用Thread.currnetThread. ...

  6. 基于IdentityServer4的单点登录——项目基本结构与流程

    组成 IdentityServer,Api和Client(客户端,asp .net core)本文以官方demo:https://github.com/IdentityServer/IdentityS ...

  7. This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed.

    Attempt to load Oracle client libraries threw BadImageFormatException. This problem will occur when ...

  8. Delphi7文件操作常用函数

    1. AssignFile.Erase AssignFile procedure AssignFile(var F; FileName: string);:给文件变量连接一个外部文件名.这里需要注意的 ...

  9. p批处理替换目录下文本中的字符串

    @echo off rem 进入批处理文件所在的路径 cd C:\Users\zxh\Desktop\ " as "abc" ***** rem 定义要替换的新旧字符串 ...

  10. ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第二章_Desktop简介 - ArcGIS知乎-新一代ArcGIS问答社区 1 Desktop简介 1.1 ArcGIS for Desktop ...