かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

ブロック

ブロックって引数の最後に&つきの変数で受け取れるってことで実験。

class Button
  attr_accessor :text
  
  def initialize text
    self.text = text
  end
  
  def add_event &event
    @events = [] unless @events
    @events << event
  end
  
  def fire_event
    @events.each { |evt| evt.call(self) } if @events
  end
  
  def to_s
    "Button text: #{text}"
  end
end

btn = Button.new "OK"
btn.fire_event # 何もおきない

btn.add_event { |sender| puts "execute1: #{sender}" }
btn.add_event { |sender| puts "execute2: #{sender}" }
btn.add_event { |sender| puts "execute3: #{sender}" }
btn.fire_event # 事前に登録したブロックが実行される

実行結果

execute1: Button text: OK
execute2: Button text: OK
execute3: Button text: OK

面白いことに使えそうだ!!