因此请参见以下代码:
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
我的问题是->
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并非如此。我也不知道为什么。
s1 === String
为假,而String === s1
为真?我认为这是因为在String的“ a”对象上的.===
实现与String类上的.===
实现不同,但是.===
的实现方式(也许为什么以这种方式工作)在字符串上工作(如何知道它应该比较对象的类而不是内存中的值/位置)?
答案 0 :(得分:1)
您是正确的==
和===
是String类和String实例上的不同方法。看看
为什么String == String
的评估结果为true
,而String === String
的评估结果不是?
正如您在文档Module.==
中所看到的,基本上是指双方是否都是同一对象。 String
类是否与String
类相同?是。但是如果右侧是左侧类的实例,则Module.===
返回true
。 String
是String
的实例吗?不。
为什么s1 === String
是false
但String === s1
是true
?
s1 === String
在字符串实例上调用===
。当双方都是同一对象时,此方法返回true
。 String
的实例和类Sting
是同一对象吗?否。但是String === s1
拥有–正如在is_a?
的含义之前已经解释的那样:String
的实例是String
的实例吗?是的。