类和案例陈述 - 为什么这不按预期进行评估?

时间:2011-07-12 18:03:27

标签: ruby

k = Integer
case k
  when Integer
    "HI"
  else "BYE"
end

在ruby 1.8中,评估结果为"BYE"。我希望评估为"HI"Integer == Integer评估为truewhen语句使用什么运算符?有什么我想念的吗?

1 个答案:

答案 0 :(得分:4)

case表达式使用===子句中对象的when运算符。所以评估为Integer === k。这里的棘手问题是Class#===基本上是以这种方式实现的:

class Class
  def ===(obj)
    obj.kind_of? self
  end
end

这适用于可以接受同一参数中的许多类的方法,因此很容易测试参数的类型并对其进行适当处理。但正如你所看到的,这不是身份测试。所以它正在测试Integer是否是Integer的一个实例 - 它不是(它是Class的一个实例)。

根据您的确切用例,哈希可能更接近您的需求。