Ruby。 class Class中大小写相等的方法是如何实现的?

Ruby. How is the case equality method implemented in the class Class?

===== 方法在 class Class 中的实现方式不同是否有任何特殊原因?

"".class == String
#=> true

"".class === String
#=> false

===(称为“案例质量”)的目标是在 case 声明中使用。创作者决定将 ===is_a? 别名用于 Module 实例最适合以下常见场景:

def do_sth(object)
  case object
    when :nothing then ...
    when String then ...
    when Hash then ...
    else ...
end

=== 应该(几乎)永远不会在 case 语句之外显式使用。

我认为我们可以进一步简化您的问题。 我相信你问的是为什么

String == String # true

但是

String === String # false

我认为 Ruby 是半一致的。 === 相等性询问右侧是否是左侧的成员。

所以

Class === String

为真,因为 String 是 Class 的成员。确实 String 不是 String 的成员。

不过我觉得奇怪的是

5 === 5 # returns true

Imo 它应该 return false 与 String === String returning false 一致,但是对于原语 Ruby 有这个怪癖,可能所以它适用于 case声明。