Help us understand the problem. What is going on with this article?

#parameters 情報です

More than 5 years have passed since last update.

いまいです。

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした