为什么"foo".class === String返回false?

eee*_*ean 4 ruby string boolean equality

当这不像我预期的那样工作时,我变得很好奇:

var = "foo"
case var.class
when String
  puts "bar"
else
  puts "baz"
=> "baz"
Run Code Online (Sandbox Code Playgroud)

我理解case语句正在使用===,但我不明白是什么===.文件说......

Case Equality - 对于Object类,实际上与调用#==相同,但通常由后代重写,以在case语句中提供有意义的语义.

http://ruby-doc.org/core-2.2.3/Object.html#method-i-3D-3D-3D

这是否意味着===在Class(或其中一个模块)中覆盖===Object?我糊涂了.

Jer*_*man 5

===被覆盖的Class对象(更一般地说,Module对象)意味着"右侧是左侧的一个实例".

例如:

>> String === ""
=> true
>> Class === String
=> true
Run Code Online (Sandbox Code Playgroud)

这是不直观的,但这是真的.但是,它确实会使您尝试做的更短:

var = "foo"
case var
when String
  puts "bar"
else
  puts "baz"
end
# outputs "bar", since String === "foo"
Run Code Online (Sandbox Code Playgroud)

这就是你的尝试不起作用的原因:Ruby评估String === String,这是错误的,因为String类本身不是一个字符串.