2012-03-02 85 views
12

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

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

这不会给预期的结果,因为即使a == String例如,a === String是不正确的。什么是聪明的方法来做到这一点?

+1

同一主题[here](http://stackoverflow.com/questions/3908380/ruby-class-types-and-case-statements) – 2012-03-02 18:04:43

+2

@selman您链接的问题是无关紧要的。该例子中的'item'不是一个类实例。 – sawa 2012-03-02 18:08:39

回答

13

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

我不明白为什么'[]'技巧可行。它几乎完全符合我的要求。你能指出什么吗? – wrtsprt 2017-10-25 09:21:53

-1

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

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

使用像这样的问题:

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 

是的,你必须重复每个whena不过这只是如何case作品。

-1

因为

Array === Array # return false 

和“情况下,当“意思是”===“,所以你遇到了问题。