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 のため。