编程知识 购物 网址 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
   -> ruby专题 -> Ruby里4种比较函数(equal?, eql?, ==, ===)详解 -> 正文阅读

[ruby专题]Ruby里4种比较函数(equal?, eql?, ==, ===)详解

本文给大家详细介绍了Ruby中的4种比较函数(equal?, eql?, ==, ===)的用法,并用具体示例进行了讲解,希望对大家学习ruby能够有所帮助。
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


记忆方法
== 按业务需求覆盖该方法 === 覆盖 case 语句时的表现 eql? 别名到 == 方法, 需要时覆盖方法改变 Hash 比较时的表现 equal? 不改动
  ruby专题 最新文章
最新的CocoaPods安装教程
Rails实现字段加密存储
mac及linux下搭建ruby+rails环境
redis集群搭建教程及遇到的问题处理
ruby中并发并行与全局锁详解
Redis集群搭建全记录
Windows下安装配置Ruby的debug工具ruby-deb
使用Ruby实现FTP密码破解
Ruby中的public、private、protected区别小
Ruby实现网页图片抓取
上一篇文章      下一篇文章      查看所有文章
加:2016-11-09 22:54:50  更:2017-05-14 02:01:30 
 
360图书馆 软件开发 购物精选 智慧山 阅读网 日历 万年历 2021年3日历
2021/3/6 21:33:44
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  编程知识