1. ホーム
  2. ruby-on-rails

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

2022-09-10 05:33:22

質問

Ruby と ROR の初心者ですが、毎日が楽しくて仕方がありません。

私たちはメソッドを持っています

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 以降のバージョンでは parameters メソッドを使用すると、そのメソッドのパラメータのリストを取得することができます。これは、パラメータの名前とそれが必須であるかどうかを示すペアのリストを返します。

とした場合

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 はもはやシンボルで呼び出すことはできません。これに対処するために、明示的な to_s はパラメータ名のリストを作成する際に追加されました。 parameters.map { |arg| arg[1].to_s }