If语句和Case语句-不匹配

use*_*677 3 ruby

为什么该if语句有效,但该case语句无效?

class A
end      # => nil

a= A.new  # => #<A:0x00007fd9d6134770>
Run Code Online (Sandbox Code Playgroud)

If 陈述作品

a.class == A  # => true
Run Code Online (Sandbox Code Playgroud)

Case 声明不起作用

case a.class   # => A
when A
  puts "done"
else
  puts "else"  # => nil
end            # => nil

# >> else
Run Code Online (Sandbox Code Playgroud)

我读过case语句使用===运算符,而不是==,如何使用==case语句?

Ama*_*dan 5

该表格case specific when archetype...将始终使用archetype.===(specific)归类检查。要使用==,您需要明确,并使用其他形式case when boolean

case
when a.class == A
  puts "done"
else
  puts "else"
end
Run Code Online (Sandbox Code Playgroud)

但是,在这种特定情况下(检查对象是否属于一个类),如果您不在乎a是的实例A还是子类的实例A(几乎总是这样),则仍然可以使用该引用检查,像这样:

case a         # Note: not a.class
when A
  puts "done"
else
  puts "else"
end
Run Code Online (Sandbox Code Playgroud)

因为A === a什么时候A上课与a.is_a?(A)。请注意,这与的不同a.class == A,如果a是的子类的实例,则不会成立A。例如class Dog < Animal,和fido = Dog.new,两者fido.instance_of?(Animal)fido.class == Animal均为false,但两者fido.is_a?(Animal)Animal === fido均为true。)