2006-04-11
イベント処理のメモ
@@events = {} x = 5 def add_event_quit(key=nil, &block) @@events[key || block.object_id] = block end add_event_quit { puts x+=1 } add_event_quit(:aaa) { puts x+=1 } def add_event_quit(arg) if arg.is_a? Proc @@events[arg.object_id] = arg else arg.each {|key, block| @@events[key] = block } end end add_event_quit lambda { puts x+=1 } add_event_quit :bbb => lambda { puts x+=1 } p @@events puts x @@events.each do |key, block| puts "key = #{key}" block.call end puts x
なるほど lambda ってこういうことか。まあここではブロック引数版のほうがよさそうだけど。 lambda 版のメリットは複数のイベントを一回のメソッド呼び出しで登録できるところ。
key を与えるのは remove_event のため。