在case语句中使用类对象
在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
更好的选择,因为从语义to_s
,你正在测试类的名称,而不是它的字符串表示; 结果可能是相同的但是case a.name
会更清楚。
如果你想使用一个case
并处理子类化,那么你可以使用Module#<=
这样:
case when a <= String then ... when a <= Fixnum then ... end
是的,你必须在每次重复a
,但这就是case
工作原理。
我的临时答案是使用to_s
,但我不确定这是否是最好的。 等待更好的答案。
case a.to_s when "String" then ... when "Fixnum" then ... end
因为
Array === Array # return false
和“case when”的意思是“===”,所以你遇到了问题。