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