红宝石类和对象-不同的比较方法

时间:2019-03-08 11:20:35

标签: 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的计算结果为true,而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类上的.===实现不同,但是.===的实现方式(也许为什么以这种方式工作)在字符串上工作(如何知道它应该比较对象的类而不是内存中的值/位置)?

1 个答案:

答案 0 :(得分:1)

您是正确的=====是String类和String实例上的不同方法。看看

的其他文档

为什么String == String的评估结果为true,而String === String的评估结果不是?

正如您在文档Module.==中所看到的,基本上是指双方是否都是同一对象。 String类是否与String类相同?是。但是如果右侧是左侧类的实例,则Module.===返回trueStringString的实例吗?不。

为什么s1 === StringfalseString === s1true

s1 === String在字符串实例上调用===。当双方都是同一对象时,此方法返回trueString的实例和类Sting是同一对象吗?否。但是String === s1拥有–正如在is_a?的含义之前已经解释的那样:String的实例是String的实例吗?是的。