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

这些比较方法的定义位置和意义分别如下。
在BasicObject中定义了:
==:比较内容是否相同,更多时候是描述两者是否相等,比如1.0 == 1的内容是不同的,但是相等!=:和==是相反的equal?:比较对象是否是同一对象,即内存地址是否相同。是最严格的,不应该随意重写这个方法
在Object中定义了:
<=>:对于Object的<=>来说,它判断两值是否相等(通过==比较),如果相等则返回0,如果不等则返回nil。但是,如果重写这个方法,应当如下设计:- 比较两个值的大小,左边大于右边返回1,等于(通过
==比较)返回0,左边小于右边返回-1 - 如果不可比较,则返回nil
- 比较两个值的大小,左边大于右边返回1,等于(通过
===:智能比较符号。如果某个类没有重写这个方法(即继承Object的===),那么它等价于==,如果重写了,则根据重写规则来判断。通常用于以下几种判断:- Array和String没有实现
===,所以这两个类中的===等价于==的行为 - 对于Range的行为,所定义的是某对象是否在某个Range范围内
- 对于Module的行为,所定义的是某对象是否是某模块的实例或后裔
- 对于Regexp的行为,所定义的是某对象是否能匹配给定模式,等价于
=~ - 所以总结起来,如果定义了
===,那么它大概是用来做成员所属判断的
- Array和String没有实现
eql?:对两者计算hash值,比较hash值是否相同。所以, 很可能是用来描述内容是否完全一致的判断,比如(1.0).eql?(1)是false
所以,对于等同性比较来说,它们严格度来说:==要比eql?宽松,eql?要比equal?宽松。
Ruby中的各种比较方式对比的更多相关文章
- Android自动化测试中AccessibilityService获取控件信息(2)-三种方式对比
Android自动化测试中AccessibilityService获取控件信息(2)-三种方式对比 上一篇文章: Android自动化测试中AccessibilityService获取控件信息(1 ...
- Spring core resourc层结构体系及JDK与Spring对classpath中资源的获取方式及结果对比
1. Spring core resourc层结构体系 1.1. Resource相关结构体系 1.2. ResourceLoader相关体系 2. JDK与Spring对classpath中资源的获 ...
- sql server查询可编程对象定义的方式对比以及整合
本文目录列表: 1.sql server查看可编程对象定义的方式对比 2.整合实现所有可编程对象定义的查看功能的存储dbo.usp_helptext2 3.dbo.helptext2的选择性测试 4. ...
- [翻译]理解Ruby中的blocks,Procs和lambda
原文出处:Understanding Ruby Blocks, Procs and Lambdas blocks,Procs和lambda(在编程领域被称为闭包)是Ruby中很强大的特性,也是最容易引 ...
- 理解Ruby中的作用域
作用域对于Ruby以及其它编程语言都是一个需要理解的至关重要的基础知识.在我刚开始学习ruby的时候遇到很多诸如变量未定义.变量没有正确赋值之类的问题,归根结底是因为自己对于ruby作用域的了解不够, ...
- [No000010]Ruby 中一些百分号(%)的用法小结
#Ruby 中一些百分号(%)的用法小结 #这篇文章主要介绍了Ruby 中一些百分号(%)的用法小结,需要的朋友可以参考下 what_frank_said = "Hello!"#% ...
- Ruby中Block, Proc, 和Lambda
Block Blocks就是存放一些可以被执行的代码的块,通常用do...end 或者 {}表示 例如: [1, 2, 3].each do |num| puts num end [1, 2, 3]. ...
- C# & SQL Server大数据量插入方式对比
以下内容大部分来自: http://blog.csdn.net/tjvictor/article/details/4360030 部分内容出自互联网,实验结果为亲测. 最近自己开发一个向数据库中插入大 ...
- ruby中symbol
Symbol 是什么 Ruby 是一个强大的面向对象脚本语言(本文所用 Ruby 版本为1.8.6),在 Ruby 中 Symbol 表示“名字”,比如字符串的名字,标识符的名字. 创建一个 Symb ...
随机推荐
- ZOJ 2319 Beatuiful People(单调递增序列的变形)
Beautiful People Time Limit: 5 Seconds Memory Limit: 32768 KB Special Judge The most prest ...
- WPF党旗和国徽!
原文:WPF党旗和国徽! 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangyisen0713/article/details/18087007 ...
- Matlab Tricks(二十四)—— 将一副图像逆时针旋转 180°
function I2 = rot180(I) I2 = I(end:-1:1, end:-1:1); % 上下颠倒,左右颠倒:
- GDI+ Bitmap与WPF BitmapImage的相互转换
原文:GDI+ Bitmap与WPF BitmapImage的相互转换 using System.Windows.Interop; //... // Convert BitmapImage to Bi ...
- xadmin下修改左道航的显示不是中文字修改方法
解决方案: 在对应的apps下有一个apps.py文件添加verbose_name=u"想要的字" 在对应的__init__.py 添加 default_app_config= ...
- Android零基础入门第38节:初识Adapter
原文:Android零基础入门第38节:初识Adapter 在上一节一起了解了ListView的简单使用,那么本节继续来学习与ListView有着千丝万缕的Adapter. 一.了解MVC模式 在开始 ...
- Android零基础入门第34节:Android中基于监听的事件处理
原文:Android零基础入门第34节:Android中基于监听的事件处理 上一期我们学习了Android中的事件处理,也详细学习了Android中基于监听的事件处理,同时学会了匿名内部类形式,那么本 ...
- jdbc连接oracle数据库字符串
jdbc连接oracle数据库有两种方式: 连接数据库SID 连接数据库service_name 当连接SID时,字符串如下: url::orcl1" password="xxxx ...
- Android零基础入门第82节:Activity数据回传
上一节学习了将简单的数据从MainActivity传递到SecondActivity,本节一起来学习数据如何从SecondActivity回传到MainActivity. 一.简介 前面己经提到,Ac ...
- WPF使用AForge实现Webcam预览(二)
本文主要介绍如何让摄像头预览界面的宽高比始终在16:9. 首先我们需要修改一下上一篇随笔实现的UI界面,让Grid变成一个3*3的九宫格,预览界面位于正中间.Xaml示例代码如下: <Windo ...