在case语句中使用类对象的最佳方法是什么?假设我有a
这是Class
类的一个实例。我想匹配不同的课程。如果我做在case语句中使用类对象
case a
when String then ...
when Fixnum then ...
end
这不会给预期的结果,因为即使a == String
例如,a === String
是不正确的。什么是聪明的方法来做到这一点?
在case语句中使用类对象的最佳方法是什么?假设我有a
这是Class
类的一个实例。我想匹配不同的课程。如果我做在case语句中使用类对象
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
我不明白为什么'[]'技巧可行。它几乎完全符合我的要求。你能指出什么吗? – wrtsprt 2017-10-25 09:21:53
我的临时答案是使用to_s
,但我不确定这是否是最好的可以完成的。等待更好的答案。
case a.to_s
when "String" then ...
when "Fixnum" then ...
end
使用像这样的问题:
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
是的,你必须重复每个when
a
不过这只是如何case
作品。
因为
Array === Array # return false
和“情况下,当“意思是”===“,所以你遇到了问题。
同一主题[here](http://stackoverflow.com/questions/3908380/ruby-class-types-and-case-statements) – 2012-03-02 18:04:43
@selman您链接的问题是无关紧要的。该例子中的'item'不是一个类实例。 – sawa 2012-03-02 18:08:39