lambdaを配列にとっておいてevent dispatch

前にObject#method(:関数名).callで高階関数を使った
Proc.newかprocかlambdaでblockを受けて無名関数を作って配列に入れておくと、簡単なEventDispatcherとして使える

class Dispatcher
  attr_accessor :onNext, :now
  
  def initialize
    @now = 0
    @onNext = Array.new
  end
  
  def next
    @now+=1
    @onNext.each{|m|
      m.call(now) if m.class == Proc
    }
  end
end

d = Dispatcher.new
d.onNext << lambda{
  puts '呼ばれた'
}
d.onNext << lambda{|current|
  puts "#{current}つ目です"
}

while d.now < 10 do
  d.next
end


実行結果

呼ばれた
今1つ目です
呼ばれた
今2つ目です
呼ばれた
今3つ目です
呼ばれた
今4つ目です
呼ばれた
今5つ目です
呼ばれた
今6つ目です
呼ばれた
今7つ目です
呼ばれた
今8つ目です
呼ばれた
今9つ目です
呼ばれた
今10つ目です