いまいです。
こんにちわ。突然ですが、キーワード引数って使ってますか?
->(k: :v, **h){[k, h]}[] #=> [:v, {}]
->(k: :v, **h){[k, h]}[k: :V] #=> [:V, {}]
->(k: :v, **h){[k, h]}[K: :V] #=> [:v, {:K=>:V}]
仮引数にハッシュを書くと、キーが変数名に、値はそのデフォルト値になるって感じでしょうか。** は、仮引数で指定しなかったペアをまとめてハッシュで受け取れます。
それはそれとして、Proc#parameters という、メタプログラミング好きな人の心を微妙につかむ、面白いメソッドがあります。
->(k: :v, **h){}.parameters #=> [[:key, :k], [:keyrest, :h]]
仮引数の種類と名前を要素とした配列の配列を返してくれます。Method や UnboundMethod のインスタンスにも parameters メソッドが定義されていますが、組み込みのメソッドでは引数の種類しか取得できないという制約があります。また、Proc も *Method も、仮引数名を省略した :rest 引数では当然ながら名前は取得できません。
define_singleton_method(:hi){|a|}.parameters #=> [[:req, :a]]
method(:method).parameters #=> [[:req]]
->(*){}.parameters #=> [[:rest]]
つい先日までは、以下のように :opt/:rest/:key を組み合わせると、:opt 引数の情報が返ってこないというバグがありましたが、
->(o = :d, *r, k: :v){}.parameters #=> [[:rest, :r], [:key, :k]]
Bug #7540 として登録したところ、すっきりと修正されました。今みなさんのお手元では、以下のように正しい結果が返ると思います。こうならない人は、早速 trunk をコンパイルしないと、ですね。
->(o = :d, *r, k: :v){}.parameters #=> [[:opt, :o], [:rest, :r], [:key, :k]]
なにか気づいたことがあればバグ報告しましょう。今ならきっと間に合います。
I wish you Merry Christmas & Happy New Year!