2012-03-02 47 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 

和「情況下,當「意思是」===「,所以你遇到了問題。