Techioz Blog

Rubyでメソッドの引数にアクセスする方法はありますか?

概要

Ruby と ROR は初めてですが、毎日気に入っています。Google で検索する方法がわからないので、ここに質問があります (試してみました:))

私たちにはメソッドがあります

def foo(first_name, last_name, age, sex, is_plumber)
    # some code
    # error happens here
    logger.error "Method has failed, here are all method arguments #{SOMETHING}"    
end

それで、私が探しているのは、それぞれをリストせずに、メソッドに渡されるすべての引数を取得する方法です。これはRubyなので、方法があると思います:) Javaだったら、単にそれらをリストするだけです:)

出力は次のようになります:

Method has failed, here are all method arguments {"Mario", "Super", 40, true, true}

解決策

Ruby 1.9.2 以降では、メソッドでパラメータ メソッドを使用して、そのメソッドのパラメータのリストを取得できます。これにより、パラメータの名前とそれが必須かどうかを示すペアのリストが返されます。

例えば

もし、するなら

def foo(x, y)
end

それから

method(:foo).parameters # => [[:req, :x], [:req, :y]]

特殊変数 method を使用して、現在のメソッドの名前を取得できます。したがって、メソッド内でそのパラメータの名前は次のようにして取得できます。

args = method(__method__).parameters.map { |arg| arg[1].to_s }

次に、次のようにして各パラメータの名前と値を表示できます。

logger.error "Method failed with " + args.map { |arg| "#{arg} = #{eval arg}" }.join(', ')

注: この回答は最初に書かれたものなので、Ruby の現在のバージョンでは、シンボルを使用して eval を呼び出すことはできなくなりました。これに対処するために、パラメーター名のリスト、つまりparameters.map { |arg| を作成するときに明示的な to_s が追加されました。 arg[1].to_s }