在case语句中使用类对象

时间:2012-03-02 17:43:24

标签: ruby class switch-statement

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

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

这不会给出预期的结果,因为即使a == String例如a === String不正确。有什么聪明的方法呢?

4 个答案:

答案 0 :(得分:14)

我不会使用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

答案 1 :(得分:11)

使用类似这样的问题:

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

是它完全错过了子类,所以你可以得到一些String,但你的第一个分支会遗漏它。此外,nameto_s更好的选择,因为从语义上讲,你正在测试类的名称而不是它的字符串表示;结果可能相同,但case a.name会更清楚。

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

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

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

答案 2 :(得分:-1)

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

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

答案 3 :(得分:-1)

由于

Array === Array # return false

和&#34;&#34;&#34;意味着&#34; ===&#34;,所以你遇到了问题。