洋食の日記

「だ・である」調ではなく「です・ます」調で書きはじめれば良かったなと後悔してる人のブログです

Rubyでキーワード引数の引数名と値の一覧をHashで得る

はじめに

Ruby 1.9以前のHashでキーワード引数を再現してたような感じで、Ruby 2.0以降のキーワード引数でも、引数の名前とその値の一覧をHashで得たいときがある。

コード

def foo(a: 'yes', b: 'no')
  keywd_args = method(__callee__).parameters.map { |_t, arg| [arg, binding.local_variable_get(arg)] }.to_h
  p keywd_args
end

これをirbで動かすと以下の様な感じ。キーワード引数の名前とその値を、Hashで得ることができている。

irb(main):005:0> foo
{:a=>"yes", :b=>"no"}
=> {:a=>"yes", :b=>"no"}

irb(main):006:0> foo(a: '123', b: '456')
{:a=>"123", :b=>"456"}

irb(main):007:0> foo(a: 'bar')
{:a=>"bar", :b=>"no"}
=> {:a=>"bar", :b=>"no"}

簡単な解説

  • __callee__が返すメソッド名のシンボルをmethodメソッドに渡してMethodオブジェクトを得る
  • Methodオブジェクトのparametersメソッドが返す引数の種類と名前によるArrayをmapで展開する
  • bindingのlocal_variable_getメソッドに引数の名前を与えて引数の値を得る
  • 引数名と値のペアによるArrayをto_hでHashにする

おわりに

「前にどうしたっけな〜」とよく忘れてしまう自分のためのメモ 📝