【问题标题】:Why are Ruby cases not working with classes?为什么 Ruby 案例不适用于类?
【发布时间】:2013-01-25 00:01:15
【问题描述】:
case "Hello".class
  when Integer
      print "A"
  when String
      print "B"
  else
      print "C"
end

为什么我会得到“C”?期待“B”,因为如果你评估"String".class,你会得到String。

【问题讨论】:

  • 很多票支持关闭这个!很抱歉 :(...,但为什么这是一个糟糕的问题?我只是在 Ruby 中发现了一个我无法理解的奇怪行为...
  • 你为什么会期待B? "Hello".class 显然是 Class,既不是 Integer 也不是 String,所以 C 是这里唯一合理的答案。
  • @JörgWMittag 也许 OP 不知道 case 语句使用 === 而不是 ==。
  • 您(Omega)可能感兴趣的相关(但不相同)问题是stackoverflow.com/q/9537895/38765
  • @JörgWMittag:哦,我不知道——也许我对 Ruby 太陌生,不知道 case 语句使用了 ===?您可能会发现这很明显,这很好,但我没有,谢谢。

标签: ruby string class switch-statement


【解决方案1】:

令人困惑的是,Ruby 的case 语句使用=== 将每个案例与主题进行比较。 Class#=== 测试该类的实例,但不测试该类本身:

> Fixnum === Integer
false
> Fixnum === 1
true

Ruby 试图推广的case 行为是:

case "Hello"
  when Integer
    puts "A"
  when String
    puts "B"
  else
    puts "C"
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 2023-03-06
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多