为什么 “foo”.class === 字符串返回 false?

Why does "foo".class === String return false?

提问人:eeeeeean 提问时间:12/1/2015 最后编辑:Richard Hamiltoneeeeeean 更新时间:12/1/2015 访问量:112

问:

当这没有像我预期的那样工作时,我开始好奇:

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?我很困惑。======

Ruby 字符串 布尔 相等

评论


答:

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 === StringString

2赞 Richard Hamilton 12/1/2015 #2

你在这里处理。在这里,它被后代覆盖以提供有意义的语义。在这种情况下,将覆盖它。case equalityModule

大小写相等 — 如果对象是模块的实例或模块的后代之一,则返回 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"