Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
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 のため。