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"