整数=== 3如何工作?

时间:2010-01-08 20:11:36

标签: ruby

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

3 个答案:

答案 0 :(得分:8)

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

Class反过来是Module的子类(虽然它可能不应该,因为它违反了Liskov替代原则,但这是对另一个论坛的讨论,也是一个死已多次被打过的马)。在Module#===中,您会找到您要查找的定义,Class继承自ModuleClass的实例(如Integer)理解。

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

  

据我所知,===运算符测试RHS对象是否是LHS对象的成员。

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

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

相关问题