はじめに
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にする
おわりに
「前にどうしたっけな〜」とよく忘れてしまう自分のためのメモ 📝