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 ...
随机推荐
- python发送电子邮件
或者收发邮件都得小心翼翼的,怕一不小心被有心人瞧见,又得被说说. 为了能发邮件而不被发现,嘿嘿.我就用python写了个邮件发送程序,用控制台控制,不了解的人一定以为哥还在编程工作呢.哈哈. 以下简介 ...
- Binding控件某个属性
<Grid Margin="60"> <Grid.RowDefinitions> <RowDefinition Height="*" ...
- discuz电脑访问手机版域名怎么跳转到电脑版本
用discuz论坛访问手机版本的域名不会自动跳转到电脑版本,而是会跳转到域名+misc.php?mod=mobile体验很不好.现提供修改方法:打开论坛根目录找到文件./source/class/di ...
- 2013年新年礼物---CrossFPC 终于出来了
2012年12月份,玛雅人的预言没有实现,一个内部进行了7年开发的CrossFPC 终于见光了. 网址:http://www.crossfpc.com/ Welcome to CrossFPC, a ...
- Win8Metro(C#)数字图像处理--2.16图像浮雕效果
原文:Win8Metro(C#)数字图像处理--2.16图像浮雕效果 [函数名称] 图像浮雕效果函数ReliefProcess(WriteableBitmap src) [函数代码] ...
- HLS(HTTP Live Streaming)学习和探讨
Introduction HTTP Live Streaming lets you send audio and video over HTTP from an ordinary web server ...
- C#如何使用PythonTuple类型
示例代码: new PythonTuple(new[] { 1, 2, 3 }); PythonTuple myTuple = PythonOps.MakeTuple(new object[] { 1 ...
- WPF实现系统禁音的方法
方法1: [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern ...
- Android零基础入门第57节:日期选择器DatePicker和时间选择器TimePicker
原文:Android零基础入门第57节:日期选择器DatePicker和时间选择器TimePicker 在实际开发中,经常会遇见一些时间选择器.日期选择器.数字选择器等需求,那么从本期开始来学习And ...
- ORA-19625: error identifying file XXXXX
在RMAN备份全库的时候,将归档日志一同进行备份,结果报如下错误,可以看到是无法获得对应归档日志的报错: RMAN: ========================================= ...