Rubinius は出来る子!という話

以下の記事を読みました。

lambdaの動作 - はてなかよっ!

それはさすがにどうだろう、と思うわけですが、でも我々には Rubinius という素晴らしい武器があるではないですか!

class Foo
  Map = {
    'key1' => lambda { |bar|
      puts bar
      p MethodContext.current.sender.sender.receiver
    }
  }

  def baz(key, bar)
    Map[key].call(bar)
  end
end

foo = Foo.new
foo.baz('key1', foo.object_id.to_s)

#=> 9
#=> #<Foo:0x9>

てなわけで、出来なくはありません。でもこういうのを使うと世間様に怒られそうな気がします。

追記

id:miura1729 さんの Binding.of_caller はとってもタメになるので是非読みましょう。CRuby でもこんな方法で出来るんですね、ありがとうございました!

CRubyも出来る子!という話 - miura1729の日記

Binding.of_caller のことを今まで知らなかったのですが(出自は Rails なのかな、それとももっと前からあるのかな?)、おお、なんと見事な set_trace_func でしょうか。return してから line に入ったタイミングで binding を取得するわけですね。賢いなぁ。set_trace_func は注目したことがなかったのでなにか楽しい活用方法を考えてみたいと思いました。