かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

ブロック

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

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

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