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文で書いてしまってもいいのかも。
[ ツッコむ ]
以上、1 日分です。