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?(类)
是真的
。如果这是对另一个答案的回应,这应该是一个评论。如果它是对原始问题的回应,它会以更少的轻蔑语气获得更好的投票结果。评论,因为没有人投票反对。