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