2012-03-02 14 views
12

caseステートメントでクラスオブジェクトを使用する最も良い方法は何ですか? Classクラスのインスタンスであるaがあるとします。私はそれを別のクラスと照合したい。私はcaseステートメントでクラスオブジェクトを使用する

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

を行う場合は例えば仮にa == Stringので、これは意図した結果が得られないであろう、a === Stringは真実ではありません。これを行う賢い方法は何ですか?

+1

同じトピック[こちら](http://stackoverflow.com/questions/3908380/ruby-class-types-and-case-statements) –

+2

@selmanあなたがリンクしている質問は無関係です。この例の 'item'はクラスインスタンスではありません。 – sawa

答えて

13

私はので、多分、私は

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

-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 

あなたはStringですが、あなたの最初の分岐では見逃されている何かを得ることができますので、それは完全にサブクラスをミスということです。また、nameは意味的な意味で、to_sよりも優れた選択です。文字列表現ではなくクラスの名前をテストしています。結果は同じかもしれませんが、case a.nameがより明確になります。

あなたがcaseを使用して、サブクラスに対処したいなら、あなたはこのようなModule#<=を使用することができます。

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

はい、あなたは各whenaを繰り返す必要がありますが、それはどれだけcase作品です。 "String".to_s"String"になるので

-1

ため

Array === Array # return false 

と「ケースやるだろう、to_s使用することはありません"==="を意味するので、あなたは問題を抱えています。

関連する問題