10
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RubyAdvent Calendar 2012

Day 18

#parameters 情報です

Posted at

いまいです。

こんにちわ。突然ですが、キーワード引数って使ってますか?

->(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!

10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?