Ruby 整数===3是如何工作的?

Ruby 整数===3是如何工作的?,ruby,Ruby,据我所知,==操作符测试RHS对象是否是LHS对象的成员。这是有道理的。但是这在Ruby中是如何工作的呢?我正在查看Ruby文档,我只看到在对象中定义的=,在整数本身中没有看到它。它只是没有被记录吗?它是在模块上定义的,哪个类是的子类,哪个整数是的实例 换句话说,当您运行Integer===3时,您在常量Integer引用的对象上调用“==”(使用参数3),该对象是名为class的类的实例。由于类是模块的一个子类,并且没有定义自己的====,所以您可以得到在模块上定义的===的实现 有关更多信息

据我所知,
==
操作符测试RHS对象是否是LHS对象的成员。这是有道理的。但是这在Ruby中是如何工作的呢?我正在查看Ruby文档,我只看到在
对象
中定义的
=
,在
整数
本身中没有看到它。它只是没有被记录吗?

它是在模块上定义的,哪个类是的子类,哪个整数是的实例

换句话说,当您运行
Integer===3
时,您在常量Integer引用的对象上调用“==”(使用参数3),该对象是名为class的类的实例。由于类是模块的一个子类,并且没有定义自己的
====
,所以您可以得到在模块上定义的===的实现


有关更多信息,请参见。

嗯,Integer是Object的一个子类。

Integer
是一个类,这(至少在Ruby中)意味着它只是一个无聊的普通对象,就像任何其他对象一样,只是碰巧是
类的一个实例(而不是,比如说,
对象
字符串
MyWhateverFoo

又是
模块
的子类(虽然可以说它不应该是,因为它违反了Liskov替代原则,但这是另一个论坛的讨论,也是一匹已经被多次击败的死马)。在
模块#==
中,您将找到您要查找的定义,
继承自
模块
,并且
的实例(如
整数
)可以理解

模块#=
基本上是对称于
对象#种类
定义的,如果其参数是自身的实例,则返回
true
。因此,
3
整数
的实例,因此
整数===3
返回
true
,就像
3.kind?(Integer)
一样

据我所知,
==
操作符测试RHS对象是否是LHS对象的成员

不一定。
==
是一个方法,就像其他任何方法一样。它做我想让它做的任何事情。在某些情况下,“是”类比失败了。在这种情况下,已经很难接受了。如果你是一个铁杆类型理论怪胎,那么将类型视为一个集合,并将该类型的实例视为集合的成员是完全自然的。当然,对于
Array
Hash
而言,“成员”的定义也是显而易见的

但是关于
Regexp
?同样,如果你是正式语言爱好者,并且对乔姆斯基非常了解,那么将
Regexp
解释为一组无限的单词和
String
s作为该集合的成员感觉完全自然,但如果不是,那么听起来有点奇怪

到目前为止,我还没有对
===
的确切含义给出一个简洁的描述。事实上,我甚至没有给它起一个好名字。它通常被称为三重相等运算符、三重相等运算符或大小写相等运算符,但我非常不喜欢这些名称,因为它与相等完全无关

那么,它能做什么呢?我想到的最好的方法是:假设你在做一个表,其中一个列标题是
Integer
。在该列中写入
3
有意义吗?如果其中一个列标题是
/ab*a/
,在该列中写入
'abbba'
有意义吗


基于该定义,它可以被称为包容运算符,但这比其他示例更糟糕…

Integer。超类
数值的
数值的。超类
对象
,因此您的语句可以说是正确的。此外,如果您引用(而不仅仅是原来的问题),那么这个语句也是正确的--
Integer.kind\u of?(类)
真的
。如果这是对另一个答案的回应,这应该是一个评论。如果它是对原始问题的回应,它会以更少的轻蔑语气获得更好的投票结果。评论,因为没有人投票反对。