在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