时间:2021-05-22
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_objectwhen /a regex/ # The regex matcheswhen String # some_object is kind of Stringwhen 2..4 # some_object is in the range 2..4when lambda {|x| some_crazy_custom_predicate } # the lambda returned trueend等同于
if /a regex/ === some_object # The regex matcheselsif String === some_object # some_object is kind of objectelsif (2..4) === some_object # some_object is in the range 2..4elsif lambda {|x| some_crazy_custom_predicate } === some_object # the lambda returned trueendeql? - 通常意义上的 相等
如果两个对象的值相同将返回 true,如果重新定义了子类的 == 方法,一般需要 alias 到 eql? 方法。 当然也有例外,整数与小数的比较两个方法的返回值就不同。
1 == 1.0 #=> true1.eql? 1.0 #=> falseeql? 用在 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中及时相同的对象
记忆方法
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
很早就知道ruby有4种相等性判断方法,分别是:“==”,“===”,“equal?”和“eql?”,平常程序中都有使用,但是感觉对其缺乏深入理
虽然这个问题我是在Python里遇到的,但是用Ruby解释起来比较容易一些。在Ruby里,遍历一个数组可以有很多种方法,最常用的两种无非是for和each:复制
复制代码代码如下:#include#include//比较函数返回值#defineA_EQUAL_B0#defineA_LARGE_B1#defineA_LOW
1、equal()equal(actual,expected[,message])相当于使用==运算符比较两个参数值actual和expected是否相等,如果
第一种:x0=''\''\'Python'\'Ruby'\''第二种:x1='\\Python\Ruby\'第三种:x2=('''''Python''Ruby'