提问人:eeeeeean 提问时间:12/1/2015 最后编辑:Richard Hamiltoneeeeeean 更新时间:12/1/2015 访问量:112
为什么 “foo”.class === 字符串返回 false?
Why does "foo".class === String return false?
问:
当这没有像我预期的那样工作时,我开始好奇:
var = "foo"
case var.class
when String
puts "bar"
else
puts "baz"
=> "baz"
我知道案例陈述正在使用 ,但我不明白有什么作用。文档说...===
===
大小写相等 – 对于类 Object,实际上与调用 #== 相同, 但通常被后代覆盖以提供有意义的 case 语句中的语义。
http://ruby-doc.org/core-2.2.3/Object.html#method-i-3D-3D-3D
这是否意味着 in Class(或其模块之一)覆盖了 Object 中的 Object?我很困惑。===
===
答:
5赞
Jeremy Roman
12/1/2015
#1
===
对于对象(更一般地说,Module
对象)被覆盖,表示“右侧是左侧的实例”。Class
例如:
>> 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
2赞
Richard Hamilton
12/1/2015
#2
你在这里处理。在这里,它被后代覆盖以提供有意义的语义。在这种情况下,将覆盖它。case equality
Module
大小写相等 — 如果对象是模块的实例或模块的后代之一,则返回 true。对模块的用途有限,但可以在 case 语句中使用,以按类对对象进行分类。
在模块中,就像 Ruby 的方法一样。===
is_a?
在本例中,它返回 false,因为它不是字符串类的实例。"Foo".class
"Foo".class.is_a?(String)
=> false
1赞
SteveTurczyn
12/1/2015
#3
它与如何为类实现大小写等价运算符有关。使用对象,而不是对象.class===
var = "foo"
case var
when String
puts "bar"
else
puts "baz"
=> "bar"
评论