据我了解,===
运算符会测试 RHS 对象是否是 LHS 对象的成员。这就说得通了。但是这在 Ruby 中是如何工作的呢?我正在查看 Ruby 文档,我只看到 ===
在 Object
中定义,而在 Integer
本身中看不到它。只是没有记录吗?
最佳答案
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)
会。
So as I understand it, the
===
operator tests to see if the RHS object is a member of the LHS object.
不一定。 ===
是一种方法,就像任何其他方法一样。它做任何我想让它做的事。在某些情况下,“是...的成员”类比会失效。在这种情况下,已经很难下咽了。如果您是类型理论的铁杆狂热者,那么将类型视为集合并将该类型的实例视为集合的成员是完全自然的。当然,对于 Array
和 Hash
,“成员”的定义也是显而易见的。
但是 Regexp
呢?同样,如果您是形式语言爱好者并且对 Chomsky 倒退有了解,那么将 Regexp
解释为无限的单词集并将 String
解释为该集的成员感觉完全自然,但如果不是,那就听起来有点奇怪。
到目前为止,我还没有对 ===
的含义准确地给出一个简洁的描述。事实上,我什至还没有想出一个好名字。它通常被称为三等号运算符、三等号运算符 或大小写等号运算符,但我非常不喜欢这些名称,因为它与平等对待。
那么,它有什么作用呢?我想出的最好办法是:假设您正在制作一个表格,其中一个列标题是 Integer
。在该列中写入 3
是否有意义?如果其中一个列标题是 /ab*a/
,在该列中写入 'abbbba'
是否有意义?
根据该定义,它可以称为包含运算符,但这比其他示例更糟糕......
关于ruby - Integer === 3 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2030417/