Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >equal, eql, ===, and ==,有什么区别?

equal, eql, ===, and ==,有什么区别?

提问于 2017-12-19 02:57:22
回答 2关注 0查看 398

我想了解这四种方法之间的区别。 我知道默认==调用方法相等? 当两个操作数引用完全相同的对象时,它将返回true。

===默认情况下也调用==哪个调用相等?...好吧,所以如果所有这三个方法都不覆盖,那么我猜

===,==和平等? 做同样的事情?

现在来eql? 这是做什么(默认)? 它是否调用操作数的哈希/ ID?

为什么Ruby有这么多的平等标志? 他们是否应该在语义上有所不同?

回答 2

御姐万岁

发布于 2017-12-19 03:17:54

uby公开了几种处理相等的方法:

a.equal?(b)#对象标识 - a和b是指同一个对象

a.eql?(b)#对象等价 - a和b具有相同的值

a == b#对象等价 - a和b与类型转换具有相同的值。

点击下面的链接继续阅读,这给了我一个明确的总结了解。

https://www.relishapp.com/rspec/rspec-expectations/v/2-0/docs/matchers/equality-matchers

akjok54

发布于 2017-12-19 03:17:31

我将在这里大量引用Object文档,因为我认为它有一些很好的解释。我鼓励你阅读它,以及这些方法的文档,因为它们在其他类中被重写,比如String。

注意:如果你想在不同的物体上尝试这些,请使用下面的内容:

代码语言:txt
AI代码解释
复制
class Object
代码语言:txt
AI代码解释
复制
  def all_equals(o)
代码语言:txt
AI代码解释
复制
    ops = [:==, :===, :eql?, :equal?]
代码语言:txt
AI代码解释
复制
    Hash[ops.map(&:to_s).zip(ops.map {|s| send(s, o) })]
代码语言:txt
AI代码解释
复制
  end
代码语言:txt
AI代码解释
复制
end
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
"a".all_equals "a" # => {"=="=>true, "==="=>true, "eql?"=>true, "equal?"=>false}

== - 通用的“平等”

在对象级别,==只有当obj和other是同一个对象时才返回true 。通常,这个方法在子类中被覆盖,以提供类特定的含义。

这是最常见的比较,因此是你(作为一个类的作者)决定两个对象是否“相等”的最基本的地方。

=== - 案件平等

对于类Object来说,实际上与调用相同#==,但通常被后代覆盖,以在case语句中提供有意义的语义。

这非常有用。有趣的===实现的东西的例子:

范围

正则表达式

Proc(在Ruby 1.9中)

所以你可以做这样的事情:

代码语言:txt
AI代码解释
复制
case some_object
代码语言:txt
AI代码解释
复制
when /a regex/
代码语言:txt
AI代码解释
复制
  # The regex matches
代码语言:txt
AI代码解释
复制
when 2..4
代码语言:txt
AI代码解释
复制
  # some_object is in the range 2..4
代码语言:txt
AI代码解释
复制
when lambda {|x| some_crazy_custom_predicate }
代码语言:txt
AI代码解释
复制
  # the lambda returned true
代码语言:txt
AI代码解释
复制
end

在这里看到我的答案是一个很好的例子,说明case+ Regex如何使代码变得更加清晰。当然,通过提供你自己的===实现,你可以得到自定义的case语义。

eql?- Hash平等

eql?如果obj和other引用相同的散列键,该方法返回true 。这被用来Hash测试成员的平等。对于课堂上的对象Object,eql?是同义词==。通常,子类别通过eql?重写它们的重写==方法来延续这个传统,但也有例外。Numeric类型,例如,执行类型转换==,但不跨越eql?,所以:

代码语言:txt
AI代码解释
复制
1 == 1.0     #=> true
代码语言:txt
AI代码解释
复制
1.eql? 1.0   #=> false

所以你可以自由的覆盖这个用于你自己的用途,或者你可以覆盖==和使用alias :eql? :==这两个方法的行为是一样的。

equal? - 身份比较

与此不同的是==,这个equal?方法不应该被子类所覆盖:它被用来确定对象的标识(也就是说,a.equal?(b)iff a与对象相同b)。

这是有效的指针比较。

和开发者交流更多问题细节吧,去 写回答
相关文章
GTX/GTH/GTY/GTP/GTZ/GTM有什么区别?
  不同芯片上使用的高速收发器也不同,而且同样是GTX,不同系列芯片上的速率也可能不同。
猫叔Rex
2022/01/24
1.8K0
GTX/GTH/GTY/GTP/GTZ/GTM有什么区别?
tf.less_equal或tf.math.less_equal
原链接: https://tensorflow.google.cn/versions/r1.14/api_docs/python/tf/math/less_equal
狼啸风云
2019/06/17
2.5K0
都是net,有什么区别
pin与pin之间都是通过net相连的,可以看到net举足轻重的地位。通过net可以找到与之相连的pin或cell,而net本身也有一些重要的属性。
Lauren的FPGA
2020/02/17
1.7K0
都是net,有什么区别
都是pin,有什么区别
打开任何阶段的DCP,选中一个cell,按F4,都会显示其Schematic视图。在这个视图中,可以清楚地看到每个cell的pin。小到一个触发器、查找表,大到用户的RTL模块甚至整个顶层设计,都有相应的pin。这里,我们重点了解一下pin的特征,借助这些特征可以帮助我们高效地搜到到目标pin。
Lauren的FPGA
2020/02/17
3.8K0
都是pin,有什么区别
tf.equal或tf.math.greater_equal
原链接: https://tensorflow.google.cn/versions/r1.14/api_docs/python/tf/math/greater_equal
狼啸风云
2019/06/17
3.1K0
针对长尾分布的Eql损失
论文: The Equalization Losses: Gradient-Driven Training for Long-tailed Object Recognition
孔西皮
2023/10/18
6550
C++(STL):33---hash_set、hash_map、hash_multiset、hash_multimap源码剖析
这些关联容器底层都是使用hash table实现的. 一、hash_set 由于hash_set底层是以hash table实现的,因此hash_set只是简单的调用hash table的方法即可 与set的异同点: hash_set与set都是用来快速查找元素的 但是set会对元素自动排序,而hash_set没有 hash_set和set的使用方法相同 在介绍hash table的hash functions的时候说过,hash table有一些无法处理的类型(除非用户自己书写hash function
用户3479834
2021/02/03
2.1K0
C++(STL):33---hash_set、hash_map、hash_multiset、hash_multimap源码剖析
网站https证书种类有哪些?有什么区别
  网站https证书可分为2大类,一类按照验证方式进行分类,即:DV SSL证书、OV SSL证书、EV SSL证书。另一类按照域名数量进行分类,即:单域名SSL证书、多域名SSL证书、通配符证书。
安信SSL证书
2019/07/31
5.5K0
网站https证书种类有哪些?有什么区别
Closeable和AutoCloseable有什么区别?
导读:我们知道,在java中jvm虚拟机会自动去调用gc(垃圾回收器)去回收堆中没有被引用的对象,至于什么时候回收,是不确定的,同时有些是用到其他资源,jvm也不会进行回收,类似Io流中的FileInputStream使用到了硬盘资源,垃圾回收器是不会去回收的,因此,必须手动关闭掉。我们进行手动的编写close()方法进行关闭,然而,每次这些写会造成代码冗余不优雅,JDK中对于释放资源有Closeable和AutoCloseable可以使用,以下为详解。
码农架构
2021/04/22
3.3K0
Closeable和AutoCloseable有什么区别?
OracleJDK和OpenJDK有什么区别?
Oracle JDK与OpenJDK里的JVM都是HotSpot VM。从源码层面说,两者基本上是同一个东西。
码农架构
2021/09/18
2K0
OracleJDK和OpenJDK有什么区别?
String、StringBuffer、StringBuilder有什么区别?
String 是 Java 语言非常基础和重要的类, 提供了构造和管理字符串的各种基本逻辑。它是典型的 Immutable 类,被声明成为 final class,所有属性也都是 final 的。也由于它的不可变性,类似拼接、裁剪字符串等动作,都会产生新的 String 对象。由于字符串操作的普遍性,所以相关操作的效率往往对应用性能有明显影响。
葆宁
2019/04/18
4700
kubernetes和docker有什么区别
本教程操作环境:linux5.9.8系统、docker-1.13.1版、Dell G3电脑。
码农编程进阶笔记
2023/03/23
2.1K0
kubernetes和docker有什么区别
int和Integer有什么区别?
Java虽然号称是面向对象的语言,但是原始数据类型仍然是重要的组成元素,所以在面试中,经常考察原始数据类型和包装类等Java语言特性。
灬沙师弟
2022/10/07
4.2K1
Exception和Error有什么区别?
世界上存在永远不会出错的程序吗?也许这只会出现在程序员的梦中。随着编程语言和软件的诞生,异常情况就如影随形地纠缠着我们,只有正确处理好意外情况,才能保证程序的
灬沙师弟
2022/09/06
1.6K0
蓝牙和WiFi有什么区别?
如果您拥有手机、笔记本电脑、计算机或任何其他现代电子设备,知道蓝牙和 WiFi 。
网络技术联盟站
2021/11/05
2.3K0
蓝牙和WiFi有什么区别?
tf.equal()
 参考   tf.less_equal或tf.math.less_equal - 云+社区 - 腾讯云
狼啸风云
2022/10/28
2630
tf.equal()
tf.equal(A, B)是对比这两个矩阵或者向量的相等的元素,如果是相等的那就返回True,反之返回False,返回的值的矩阵维度和A是一样的,x,y 的维度要一致
周小董
2019/03/25
9640
列表和元组有什么区别
如果有了解过python中的列表和元组,你可能会知道相对于列表,元组是不可变的,也就是说元组中的数据不能随意更改。除了列表是用中括号表示而元组是用小括号表示之外,这两种数据类型好像并没有什么不同,都是用来存放一系列的数据,事实真是如此吗? TypeError Traceback (most recent call last) in() 4 5 # 现在改变b中数据的值 — 6 b[2] = 4 TypeError: ‘tuple’ obje
企鹅号小编
2018/02/26
2.1K0
列表和元组有什么区别
Exception和Error 有什么区别
checkedException 一般是外部错误,这个异常发生在编译阶段。Java 编译器会强制去捕获此类异常。一般会要求把这段可能出现的异常程序进行 try catch。
王小明_HIT
2019/10/15
1.8K0
int 和 Integer 有什么区别?
int 是 java 的原始数据类型,Integer 是 java 为 int 提供的封装类。
MickyInvQ
2020/09/27
1.6K0

相似问题

securecrt和winscp有什么区别?

41.7K

并发VS并行 - 有什么区别?

2708

JDK和JRE有什么区别?

2459

Linux和ubantu有什么区别?

43.1K

JavaScript和ECMAScript有什么区别?

2363
相关问答用户
腾讯云TDP | TDP会员擅长3个领域
平安资管 | 架构师擅长4个领域
擅长3个领域
擅长5个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档