ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

ブロックの内容をメソッドとして持ったオブジェクトを作るメソッド

関数を渡すと、それを持ったオブジェクトが返ってくるわけです。
Rubyってめちゃくちゃ柔軟。素晴らしい。

# 受け取ったブロックをhogeメソッドとして実装したオブジェクトを返す
def test(&block)
  # 受け取ったブロックをhogeメソッドとして実装したModuleを作成する
  mod = Module.new do
    define_method("hoge", &block)
  end

  # Objectを作り、上で作ったModuleで拡張する
  obj = Object.new
  obj.extend(mod)
  obj
end

abc = 123
obj = test do
  # abcは(たぶん)フリー変数なので、アクセスできます。
  puts "abc #{abc}"
end

# hogeを呼んでみる
obj.hoge

結果はもちろん、"abc 123"が表示されます。