Integer === 3如何工作?

据我了解, ===运算符测试以查看RHS对象是否是LHS对象的成员。 那讲得通。 但是这在Ruby中是如何工作的? 我正在查看Ruby文档,我只看到在Object定义的=== ,我没有在Integer本身看到它。 它没有记录吗?

Integer是一个类,它(至少在Ruby中)意味着它只是一个无聊的旧普通对象,就像任何其他对象一样,恰好是Class类的一个实例(而不是像ObjectStringMyWhateverFoo ) 。

反过来,类是Module的子类(虽然它可能不应该是,因为它违反了Liskov替代原则,但这是对另一个论坛的讨论,也是一个已经被打过很多次的死马)。 在Module#===您将找到您正在寻找的定义,哪个Classinheritance自ModuleClass实例(如Integer )。

Module#===基本上是与Object#kind_of?对称的Object#kind_of? ,如果其参数是其自身的实例,则返回true 。 所以, 3Integer一个实例,因此Integer === 3返回true ,就像3.kind_of?(Integer)一样。

据我了解, ===运算符测试以查看RHS对象是否是LHS对象的成员。

不必要。 ===是一种方法,就像任何其他方法一样。 它做我想做的任何事情。 并且在某些情况下,“是”成员的类比分解。 在这种情况下,已经很难吞下去了。 如果你是一个硬核类型理论狂,那么将一个类型视为一个集合,并将该类型的实例视为集合的成员是完全自然的。 当然对于ArrayHash ,“成员”的定义也是显而易见的。

但是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的子类。