ruby - Integer === 3 如何工作?

标签 ruby

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

最佳答案

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

Class 又是 Module 的子类(虽然可以说它不应该是,因为它违反了 Liskov 替换原则,但这是另一个论坛的讨论,也是一匹已经被打了很多次的死马)。在 Module#=== 中你会找到你正在寻找的定义,Class 继承自 ModuleClass 的实例(如Integer)理解。

Module#=== 基本上定义为与 Object#kind_of? 对称,如果其参数是其自身的实例,则返回 true .所以,3Integer 的实例,因此 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.

不一定。 === 是一种方法,就像任何其他方法一样。它做任何我想让它做的事。在某些情况下,“是...的成员”类比会失效。在这种情况下,已经很难下咽了。如果您是类型理论的铁杆狂热者,那么将类型视为集合并将该类型的实例视为集合的成员是完全自然的。当然,对于 ArrayHash,“成员”的定义也是显而易见的。

但是 Regexp 呢?同样,如果您是形式语言爱好者并且对 Chomsky 倒退有了解,那么将 Regexp 解释为无限的单词集并将 String 解释为该集的成员感觉完全自然,但如果不是,那就听起来有点奇怪。

到目前为止,我还没有对 === 的含义准确地给出一个简洁的描述。事实上,我什至还没有想出一个好名字。它通常被称为三等号运算符三等号运算符大小写等号运算符,但我非常不喜欢这些名称,因为它与平等对待。

那么,它有什么作用呢?我想出的最好办法是:假设您正在制作一个表格,其中一个列标题是 Integer。在该列中写入 3 是否有意义?如果其中一个列标题是 /ab*a/,在该列中写入 'abbbba' 是否有意义?

根据该定义,它可以称为包含运算符,但这比其他示例更糟糕......

关于ruby - Integer === 3 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2030417/

相关文章:

ruby-on-rails - 拥有并属于与多个数据库的许多关系

ruby - 在 Mavericks 上禁用 Ruby 的应用程序小睡

ruby - Nokogiri 将值作为字符串而不是数组返回

Ruby 条件正则表达式变通方法

ruby - 如何将自定义元数据写入由 RMagick 创建的图像?

ruby-on-rails - 如何使用范围作为 POST 数据到 Rails Controller 的参数之一

sql - Rails 4 查询按月和年排序

ruby-on-rails - 根据 rails 3 中的范围计算版税

ruby - array.each 和 array.map 有何不同?

ruby - 类方法 : describe "#my_class_method" or describe "#self.my_class_method"?