Ruby里4种比较函数(equal?, eql?, ==, ===)详解

所属分类: 脚本专栏 / ruby专题 阅读数: 1742
收藏 0 赞 0 分享

Ruby里面有4种比较方法,equal?, eql?, ==, ===,而且在不同的类里面表现的很不一样。在使用的时候也特别容易搞糊涂。 这篇博文将演示一些代码来讲解各个方法。

== - 类意义上的 相等,需要每个类自己定义实现

在特定类中觉得两个对象是否相同,需要看业务上的逻辑表象,所有由程序员覆盖该方法的定义,决定两个对象是否相同。

比如 String 类,他是来计较实际的文字串是否相同,而不在意是否来自同一个内存区域。

>> a = "abc"
#=> "abc"

>> b = a + ""
#=> "abc"

?> a == b
#=> true

>> a.object_id
#=> 70255156346640

>> b.object_id
#=> 70255156340640

=== - 用在 case 语句里时会调用的方法

通常用在 case 比较调用该方法,比如

case some_object
when /a regex/
 # The regex matches
when String
 # some_object is kind of String
when 2..4
 # some_object is in the range 2..4
when lambda {|x| some_crazy_custom_predicate }
 # the lambda returned true
end

等同于

if /a regex/ === some_object
 # The regex matches
elsif String === some_object
 # some_object is kind of object
elsif (2..4) === some_object
 # some_object is in the range 2..4
elsif lambda {|x| some_crazy_custom_predicate } === some_object
 # the lambda returned true
end

eql? - 通常意义上的 相等

如果两个对象的值相同将返回 true,如果重新定义了子类的 == 方法,一般需要 alias 到 eql? 方法。 当然也有例外,整数与小数的比较两个方法的返回值就不同。

1 == 1.0  #=> true
1.eql? 1.0 #=> false

eql? 用在 Hash 里面用来做成员值比较

[1] pry(main)> hash = Hash.new
#=> {}
[2] pry(main)> hash[2] = "a"
#=> "a"
[3] pry(main)> hash[2.0] = "b"
#=> "b"
[4] pry(main)> hash[2]
#=> "a"
[5] pry(main)> hash[2.0]
#=> "b"
[6] pry(main)> hash[2.00] = "c"
#=> "c"
[7] pry(main)> hash[2.0]
#=> "c"

所以什么时候应该覆盖这个方法就看你想让他在 Hash 比较时如何表现。

equal? - 内存地址相同的对象

该方法不应该被子类覆盖
比较的是两个对象在内存中是否相同,是否有同一个object_id值
Rails中及时相同的对象

q = User.first
 User Load (40.4ms) SELECT "users".* FROM "users"  ORDER BY "users"."id" ASC LIMIT 1
#=> #<User id: 1, email: "ryan@wongyouth.com">

q2 = User.first
 User Load (0.4ms) SELECT "users".* FROM "users"  ORDER BY "users"."id" ASC LIMIT 1
#=> #<User id: 1, email: "ryan@wongyouth.com">

q.equal? q2
#=> false

记忆方法

  1. == 按业务需求覆盖该方法
  2. === 覆盖 case 语句时的表现
  3. eql? 别名到 == 方法, 需要时覆盖方法改变 Hash 比较时的表现
  4. equal? 不改动
更多精彩内容其他人还在看

ruby中的双等号==问题详解

Ruby里面有4种比较方法,equal?, eql?, ==, ===,而且在不同的类里面表现的很不一样。在使用的时候也特别容易搞糊涂。 本文先给大家讲述一下==号的用法及使用中应该注意的地方
收藏 0 赞 0 分享

Ruby里4种比较函数(equal?, eql?, ==, ===)详解

本文给大家详细介绍了Ruby中的4种比较函数(equal?, eql?, ==, ===)的用法,并用具体示例进行了讲解,希望对大家学习ruby能够有所帮助。
收藏 0 赞 0 分享

Ruby on Rails在Ping ++ 平台实现支付

本文给大家分享的是使用Ruby on Rails在Ping ++ 平台实现支付功能的代码,非常的实用,有需要的小伙伴可以参考下。
收藏 0 赞 0 分享

Ruby on Rails基础之新建项目

Ruby on Rails 是一个可以使你开发,部署,维护 web 应用程序变得简单的框架。下面我们就来看看如何简单便捷的使用这一框架,本系列文章将一一为大家揭秘
收藏 0 赞 0 分享

Ruby语法笔记

本文给大家记录的是本人学习ruby之后所记录下来的部分语法知识,分享给有需要的小伙伴,希望对大家能够有所帮助。
收藏 0 赞 0 分享

Ruby的安装与运行

本文给大家分享的是ruby的基础知识,是学习ruby必须掌握的ruby的安装和运行以及ruby的文档,非常实用,有需要的小伙伴可以参考下。
收藏 0 赞 0 分享

CentOS7下搭建ruby on rails开发环境

听说rails是一个比较流行的快速开发框架,对于我这个web不熟悉的人来说,那是极好的!可以快速上手,又能真正了解服务器端的各种,所以rails搞起来。不过一个完整的开发环境搭建过程完成后,真的只能用各种坑来形容~
收藏 0 赞 0 分享

Windows下安装配置Ruby的debug工具ruby-debug-base19

这篇文章主要介绍了Windows下安装配置Ruby的debug工具ruby-debug-base19的方法,同时讲解了Ruby的IDE RubyMine中的相关配置方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Windows下Ruby+Watir自动化测试的环境搭建及数据读取

这篇文章主要介绍了Windows下Ruby+Watir自动化测试的环境搭建及数据读取,Watir是一个使用Ruby实现的开源Web自动化测试框架,需要的朋友可以参考下
收藏 0 赞 0 分享

Ruby中使用设计模式中的简单工厂模式和工厂方法模式

这篇文章主要介绍了Ruby中使用设计模式中的简单工厂模式和工厂方法模式的示例,这两种模式经常被用于Ruby on Rails开发的结构设计中,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多