首页 > 解决方案 > ruby 类和对象 - 不同的比较方法

问题描述

所以看下面的代码:

   s1 = "a"
=> "a"
   s1.class
=> String
   s1.class == String
=> true
   s1.class === String
=> false
   String == String
=> true
   String === String
=> false
   String === s1
=> true
   String == s1
=> false
   s1 == String
=> false
   s1 === String
=> false

我的问题是->

  1. 为什么String == String评估为真但String === String 不是?

是因为实际上这些是不同的对象并且存储在内存的不同部分吗?如果是,那么我们为什么要初始化 String 的许多 Class 对象?(这些不应该是单身吗?)

String 继承自 Object 并包含 Comparable 模块。从对象字符串获取.===https://ruby-doc.org/core-2.5.1/Object.html#method-i-3D-3D-3D

并从 Comparable 获得.==https://ruby-doc.org/core-2.4.0/Comparable.html#method-i-3D-3D

通过阅读定义,我看到.===通常与 String 相同,.==但情况并非如此。我不知道为什么。

  1. 为什么s1 === String是假的却String === s1是真的?

我认为这是因为.===String 的“a”对象上的.===实现与 String 类上的实现不同,但是 String 上的.===(也许为什么它以这种方式工作)如何工作(它如何知道它应该比较对象的类而不是内存中的值/位置)?

标签: ruby

解决方案


您是对的==,并且===是 String 类和 String 实例的不同方法。查看不同的文档

为什么String == String评估为trueString === String不评估?

正如您在文档中看到的那样,Module.==基本上意味着双方是否是同一个对象。String班级和班级一样吗String?是的。但如果右侧是左侧类的实例,则Module.===返回。trueIdString的一个实例String?不。

为什么s1 === Stringfalse但是String === s1true

s1 === String调用===字符串的实例。true当双方都是同一个对象时,此方法返回。实例String和类Sting是同一个对象吗?不。但是String === s1有——正如前面已经解释过的意思is_a?:是一个实例String的实例String吗?是的。


推荐阅读