読者です 読者をやめる 読者になる 読者になる

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]