[解決済み] 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 }
関連
-
[解決済み】Ruby: 特定のバージョンのruby gemをインストールする方法は?
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] Rubyで配列に値が存在するかどうかを確認する方法
-
[解決済み] Rubyからシェルコマンドを呼び出す方法
-
[解決済み] Rubyでnilとemptyとblankを理解する方法
-
[解決済み] Rubyのattr_accessorとは何ですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] Rubyで乱数を取得する方法
-
[解決済み】rakeタスクにコマンドライン引数を渡す方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】gemのインストールができない - gemネイティブ拡張の構築に失敗 - そのようなファイルをロードできない -- mkmf (LoadError)
-
[解決済み] Railsサーバーがポートはすでに使用されていると言う、そのプロセスを殺すにはどうすればよいですか?
-
[解決済み] Rubyの文字列から日付への変換
-
[解決済み] AWS S3です。アクセスしようとしているバケットは、指定されたエンドポイントを使用してアドレスされている必要があります。
-
[解決済み] Rubyのクラスで未初期化の定数エラーが発生する
-
[解決済み] Ruby:Rubyの配列にinclude.の反対はある?
-
[解決済み] バリデーションなしで属性を更新する方法
-
[解決済み] Rspec が私のモデルクラスを認識しない。初期化されていない定数エラー
-
[解決済み] Ruby on rails アプリで ES6 (ES2015) を使用するにはどうすればよいですか?
-
[解決済み] rails/rubyでgroup_byを使用する。