在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”的意思是“===”,所以你遇到了问题。