Ruby “为什么?”;“福”;。class==字符串返回false?

Ruby “为什么?”;“福”;。class==字符串返回false?,ruby,string,boolean,equality,Ruby,String,Boolean,Equality,当这没有像我预期的那样起作用时,我变得好奇起来: var = "foo" case var.class when String puts "bar" else puts "baz" => "baz" 我理解case语句使用的是==,但我不理解===的作用。医生说 大小写相等–对于类对象,实际上与调用#==, 但通常由后代覆盖以提供有意义的 case语句中的语义 这是否意味着类(或其模块之一)中的====覆盖了对象中的==?我很困惑。==被类对象覆盖(更一般地说,是指“右侧是左侧

当这没有像我预期的那样起作用时,我变得好奇起来:

var = "foo"
case var.class
when String
  puts "bar"
else
  puts "baz"
=> "baz"
我理解case语句使用的是
==
,但我不理解
===
的作用。医生说

大小写相等–对于类对象,实际上与调用#==, 但通常由后代覆盖以提供有意义的 case语句中的语义


这是否意味着类(或其模块之一)中的
====
覆盖了对象中的
==
?我很困惑。

==
对象覆盖(更一般地说,是指“右侧是左侧的实例吗”)

例如:

>> String === ""
=> true
>> Class === String
=> true
这是不直观的,但这是真的。但是,它确实会使您要做的事情更短:

var = "foo"
case var
when String
  puts "bar"
else
  puts "baz"
end
# outputs "bar", since String === "foo"

以下是您的尝试失败的原因:Ruby计算
String===String
,这是错误的,因为
String
类本身不是字符串。

您在这里处理的是
大小写相等。在这里,它被后代覆盖以提供有意义的语义。在这种情况下,
模块将覆盖它

大小写相等-如果对象是模块实例或模块的子体之一,则返回true。对模块的使用有限,但可以在case语句中按类对对象进行分类

在模块中,
==
的作用类似于Ruby的
方法

在您的例子中,它返回false,因为
“Foo”.class
不是string类的实例

"Foo".class.is_a?(String)
=> false

它与如何为类实现case等价运算符
==
有关。使用对象,而不是object.class

var = "foo"
case var
when String
  puts "bar"
else
  puts "baz"
=> "bar"