Ruby

Rubyのmethodをlambdaに変換する

More than 1 year has passed since last update.

不毛な戦いをしようとしていると、Rubyのmethodをlambdaに変換したいときとかよくあるよね。
たとえば、以下のhogeメソッドをlambdaに変換したいような場合。

def hoge
  p 'moge'
end

結論から書くとできる。こんな感じ。

def moge
  lambda(&method(:hoge)).call() # .call()の代わりに[]でも
end

def moge
  method(:hoge).to_proc.call() # 実はこれでも動くけど、これはまた別
end

一つ一つみていくと、

  1. まず、method(:hoge)で、hogeメソッドをMethodオブジェクト化.
  2. 次に、Methodオブジェクト化したhogeメソッドの先頭に&をつけて引数として渡すことで、blockとしてlambdaにわたされる。
  3. lambdaは、"与えられたブロックからProcのインスタンスを生成して返す"。

という流れになっていて、簡単にまとめると、

symbol => Method object => block => lambdaという流れでlambdaになる。
内部的にどうなっているかは知らないです^q^

追記

Refinementsの中でこれをやろうとしたら、できなかったので注意してください。