2014/05/22(木) [n年前の日記]
#1 [ruby] クラスに分けたりバグを修正したり
swfを再生するDXRubyスクリプトをまだ弄ってたり。
今まで、1つのクラスの中で種類を持つ変数を用意して処理を分ける、みたいなことをしていたのだけど。考えてみたら別クラスにして、クラスの種類で判別したほうがいいよなと。
しかし、クラスの種類を判別する方法が分からず。if文なら、if a.class == ClassA みたいな書き方で判別できたのだけど。case 〜 when を使うと妙なことに。
以下のようなソースを書いてテスト。
今まで、1つのクラスの中で種類を持つ変数を用意して処理を分ける、みたいなことをしていたのだけど。考えてみたら別クラスにして、クラスの種類で判別したほうがいいよなと。
しかし、クラスの種類を判別する方法が分からず。if文なら、if a.class == ClassA みたいな書き方で判別できたのだけど。case 〜 when を使うと妙なことに。
以下のようなソースを書いてテスト。
class TestA class TestB end class TestC end def check t = TestC.new puts "[#{t.class}]" # OK if t.class == TestA::TestB puts " t is TestB" elsif t.class == TestA::TestC puts " t is TestC" else puts " t is unknown" end # OK if TestA::TestB === t puts " t is TestB" elsif TestA::TestC === t puts " t is TestC" else puts " t is unknown" end # NG case t.class when TestA::TestB puts " t is TestB" when TestA::TestC puts " t is TestC" else puts " t is unknown" end # OK case t when TestA::TestB puts " t is TestB" when TestA::TestC puts " t is TestC" else puts " t is unknown" end end end chk = TestA.new chk.check
[TestA::TestC] t is TestC t is TestC t is unknown t is TestCcase 〜 when を使ってクラス判別をする場合は、=== が使われるという説明記事も見かけた。だったらわざわざ case 〜 when を使わずに if文で書いてしまってもいいのかも。
[ ツッコむ ]
以上です。