ブロックでコールバック

Rubyクックブック ―エキスパートのための応用レシピ集

Rubyクックブック ―エキスパートのための応用レシピ集

レシピ4.4の抜粋して、ちょこっと変更

class EventSpawner
  def initialize(state="Java")
    @listeners = []
    @state = state
  end

  def subscribe(&listener)
    @listeners << listener
  end

  def change_state(new_state)
    @listeners.each{ | listener | listener.call(@state, new_state) }
    @state = new_state
  end
end

spawner = EventSpawner.new
spawner.subscribe do |old_state, new_state|
  puts "from #{old_state} to #{new_state}"
end

spawner.change_state("Ruby")  # => from Java to Ruby

ブロックを使って、無名のメソッドを引き渡してコールバック。Coolだ。