Ruby でメソッド名から Proc オブジェクトを生成する
#method
を使うとレシーバのメソッドを Proc オブジェクトとして生成する事ができます。
class X def class_name "class X" end end x = X.new # メソッド名を渡すとそのメソッドを呼び出す Proc オブジェクトを返す class_name = x.method :class_name class_name.call # => "class X" plus3 = 3.method :+ plus3.call 2 # => 5 # Kernel モジュールのメソッドに対しても利用できる puts_ = method :puts # そのままブロックに渡してみたり [1, 2, 3].each &puts_ # => 1 # 2 # 3
以下のようにモジュール関数をブロックに渡したい場合にも便利です。
module Math def twice a a + a end module_function :twice end [1, 2, 3].map &Math.method(:twice) # => [2, 4, 6]