在case语句中使用类对象的最佳方法是什么?假设我有a
,它是Class
类的一个实例。我想将它与不同的类相匹配。如果我做
case a
when String then ...
when Fixnum then ...
end
这不会给出预期的结果,因为即使a == String
例如,a === String
不是真的。这样做的聪明方法是什么?
我不会使用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
使用这样的东西的问题:
case a.to_s
when "String" then ...
when "Fixnum" then ...
end
是它完全错过了子类,所以你可以得到一些String,但你的第一个分支错过了。此外,name
比to_s
更好的选择,因为从语义上来说,你正在测试类的名称,而不是它的字符串表示;结果可能是相同的,但case a.name
会更清楚。
如果你想使用case
并处理子类化,那么你可以像这样使用Module#<=
:
case
when a <= String then ...
when a <= Fixnum then ...
end
是的,你必须在每个a
重复when
,但这就是case
的工作方式。
我的临时答案是使用to_s
,但我不确定这是否是最好的。等待更好的答案。
case a.to_s
when "String" then ...
when "Fixnum" then ...
end
因为
Array === Array # return false
和“case when”的意思是“===”,所以你遇到了问题。