首页 > 解决方案 > If 语句和 Case 语句 - 不匹配

问题描述

为什么if语句会起作用,但case语句不起作用?

class A
end      # => nil

a= A.new  # => #<A:0x00007fd9d6134770>

If声明作品

a.class == A  # => true

Case声明不起作用

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

# >> else

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

标签: ruby

解决方案


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

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

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

case a         # Note: not a.class
when A
  puts "done"
else
  puts "else"
end

因为A === awhen Ais a class 几乎与a.is_a?(A). 请注意,这与 不同,如果是 的子类的实例,a.class == A则不会成立。例如对于, 和, 两者和都是假的, 但两者和都是真的。)aAclass Dog < Animalfido = Dog.newfido.instance_of?(Animal)fido.class == Animalfido.is_a?(Animal)Animal === fido


推荐阅读