在case语句中使用类对象

saw*_*awa 13 ruby class switch-statement

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

case a
when String then ...
when Fixnum then ...
end
Run Code Online (Sandbox Code Playgroud)

这不会给出预期的结果,因为即使a == String例如a === String不是这样.这样做的聪明方法是什么?

And*_*imm 14

我不会用to_s,因为"String".to_s"String",所以也许我会这样做

case
when a == String then ...
when a == Fixnum then ...
end
Run Code Online (Sandbox Code Playgroud)

要么

a = String

case [a]
when [String] then puts "String"
when [Array] then puts "Array"
end
Run Code Online (Sandbox Code Playgroud)


mu *_*ort 11

使用这样的东西的问题:

case a.to_s
when "String" then ...
when "Fixnum" then ...
end
Run Code Online (Sandbox Code Playgroud)

是它完全错过了子类,所以你可以得到一些String,但你的第一个分支错过了.而且,从语义上来说,你name将是一个更好的选择to_s,你正在测试类的名称,而不是它的字符串表示; 结果可能相同,但case a.name会更清楚.

如果你想使用a case并处理子类化,那么你可以Module#<=像这样使用:

case
when a <= String then ...
when a <= Fixnum then ...
end
Run Code Online (Sandbox Code Playgroud)

是的,你必须重复a每一个,when但这就是如何case运作.