据我了解,===
运算符测试RHS对象是否是LHS对象的成员。那讲得通。但是这在Ruby中是如何工作的?我正在查看Ruby文档,我只看到===
中定义的Object
,我在Integer
中看不到它。是不是没有记录?
答案 0 :(得分:8)
Integer
是一个类,它(至少在Ruby中)意味着它只是一个无聊的旧普通对象,就像任何其他对象一样,恰好是Class
类的一个实例(而不是说Object
或String
或MyWhateverFoo
)。
Class
反过来是Module
的子类(虽然它可能不应该,因为它违反了Liskov替代原则,但这是对另一个论坛的讨论,也是一个死已多次被打过的马)。在Module#===
中,您会找到您要查找的定义,Class
继承自Module
,Class
的实例(如Integer
)理解。
Module#===
基本上与Object#kind_of?
对称定义,如果其参数是其自身的实例,则返回true
。因此,3
是Integer
的一个实例,因此Integer === 3
会返回true
,就像3.kind_of?(Integer)
一样。
据我所知,
===
运算符测试RHS对象是否是LHS对象的成员。
不一定。 ===
是一种方法,就像任何其他方法一样。它做我想做的任何事情。在某些情况下,“是”成员的类比分解。在这种情况下,它已经很难吞下去了。如果你是一个硬核类型理论狂,那么将一个类型视为一个集合,并将该类型的实例视为集合的成员是完全自然的。当然,对于Array
和Hash
,“成员”的定义也很明显。
但是Regexp
呢?同样,如果你是正式的语言buff,并且向后了解你的乔姆斯基,那么将Regexp
解释为无限的单词集,String
s作为该集合的成员感觉完全自然,但如果没有,那么它听起来很奇怪。
到目前为止,我未能提出正是 ===
的含义的简明描述。事实上,我甚至没有为它提出一个好名字。它通常被称为三等于运算符,三元运算符或大小写等式运算符,但我强烈不喜欢这些名称,因为它绝对没有任何关系做平等。
那么,它做了什么?我想出的最好的结果是:想象你正在创建一个表,其中一个列标题是Integer
。在该列中编写3
是否有意义?如果其中一个列标题是/ab*a/
,那么在该列中编写'abbbba'
是否有意义?
根据该定义,它可以被称为包含运算符,但这比其他例子更糟糕......
答案 1 :(得分:3)
它在Module上定义,哪个Class是其子类,Integer是其实例。
换句话说,当你运行Integer === 3
时,你在由常量Integer引用的对象上调用'==='(带参数3),这是一个名为class的实例类。由于Class是Module的子类,并且没有定义自己的===
,因此您可以获得在Module上定义的===的实现。
有关详细信息,请参阅API docs for Module。
答案 2 :(得分:-1)
Umm,Integer是Object的子类。