【问题标题】:Using a class object in case statement在 case 语句中使用类对象
【发布时间】:2012-03-02 17:43:24
【问题描述】:

在 case 语句中使用类对象的最佳方式是什么?假设我有a,它是Class 类的一个实例。我想将它与不同的课程相匹配。如果我这样做了

case a
when String then ...
when Fixnum then ...
end

这不会给出预期的结果,因为即使a == String 例如,a === String 不正确。这样做的巧妙方法是什么?

【问题讨论】:

  • 同主题here
  • @selman 您链接的问题无关紧要。该示例中的 item 不是类实例。

标签: ruby class switch-statement


【解决方案1】:

我不会使用to_s,因为"String".to_s 会是"String",所以也许我会这样做

case
when a == String then ...
when a == Fixnum then ...
end

a = String

case [a]
when [String] then puts "String"
when [Array] then puts "Array"
end

【讨论】:

  • 我不明白为什么 [] 技巧有效。它几乎完全符合我的要求。可以指点一下吗?
  • @wrtsprt 因为 Array 不会覆盖大小写相等运算符 :) 所以这与 [String] == [String] stackoverflow.com/questions/7734245/… 相同
【解决方案2】:

使用这样的东西的问题:

case a.to_s
when "String" then ...
when "Fixnum" then ...
end

是它完全遗漏了子类,因此您可以获得字符串但您的第一个分支遗漏的东西。此外,name 将是比to_s 更好的选择,因为从语义上讲,您正在测试类的名称而不是其字符串表示;结果可能相同,但case a.name 会更清晰。

如果您想使用case 并处理子类化,那么您可以像这样使用Module#<=

case
when a <= String then ...
when a <= Fixnum then ...
end

是的,您必须在每个 when 中重复 a,但这就是 case 的工作原理。

【讨论】:

    【解决方案3】:

    我的临时答案是使用to_s,但我不确定这是否是最好的。等待更好的答案。

    case a.to_s
    when "String" then ...
    when "Fixnum" then ...
    end
    

    【讨论】:

      【解决方案4】:

      因为

      Array === Array # return false
      

      而“case when”表示“===”,所以你遇到了问题。

      【讨论】:

        猜你喜欢
        • 2019-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-02
        • 2020-01-17
        • 2021-03-14
        • 1970-01-01
        相关资源
        最近更新 更多