Ruby里4种比较函数(equal?, eql?, ==, ===)完整指南
平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“Ruby里4种比较函数(equal?, eql?, ==, ===)”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
在这个场景下,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: "[email protected]">
q2 = User.first
User Load (0.4ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1
#=> #<User id: 1, email: "[email protected]">
q.equal? q2
#=> false
记忆方法
- == 按业务需求覆盖该方法
- === 覆盖 case 语句时的表现
- eql? 别名到 == 方法, 需时覆盖方法改变 Hash 比较时的表现
- equal? 不改动
您可能感兴趣的文章:
- Ruby实现命令行中查看函数源码的方法
- Ruby中的方法(函数)学习总结
- Ruby中常用的字符串处理函数采用实例
- ruby中的双等号==问题详解
相关资讯
-
09.05
Viggle_AI适合做什么内容
-
09.05
Surreal提示词怎么写-场景细节和风格
-
09.05
iPhone自拍肖像画面怎么描述-人物姿态和画面氛围
-
09.05
MiniMax_Agent任务指令调整语气的方法
-
09.05
Korean提示词怎么写-镜头角度和画面氛围
-
09.05
纳米AI_MCP做PPT完整教程
游戏推荐
推荐专题
热门阅读
-
- ASP常用源代码的总结(下)实用指南
- 09.05
-
-
-
- ASP编码和解码函数完整指南
- 09.05
-
-
推荐下载
-
-
下载
- |
-
-
下载
- 《行尸走肉第一章》免安装中文汉化硬盘版下载
- 单机|436 MB
- 一款以动作冒险为主题的游戏
-
-
下载
- 《街头霸王X铁拳》免安装中文汉化硬盘版下载
- 单机|111MB
- 一款非常好玩的格斗游戏
-
-
下载
- |
-
-
下载
- 《暗黑破坏神3》免安装繁体中文正式版下载
- 单机|7630 MB
- 一款以角色扮演为主题的游戏
-
-
下载
- 《马克思佩恩3》免安装硬盘版下载
- 单机|27033 MB
- 一款以第三人称射击为主题的游戏