- ベストアンサー
メソッド定義の際の引数で
楽しいRuby第4版のp.120で def a(a, b: 0, c:0) [a, b, c] end のように、必須の引数とキーワード引数を混在 させることができると説明があったので試しに def meth(a, b: 2, c: 3, *args) [a, b, c, args] end p meth(1,2,3) のように、必須の引数とキーワード引数と不定の 引数を混在させたところエラーが返りました。 やはり、不定の引数*argsまで混在させられないの でしょうか? irbで試すとメソッド定義をendで括った瞬間に エラーが返りましたんで、きっとこれが原因だと 思うのですが。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ん? たとえば http://magazine.rubyist.net/?0041-200Special-kwarg とか http://techracho.bpsinc.jp/baba/2013_02_25/6545 くらいは見つかるんだが?
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
ちょっと調べた限りでは「混在させること」はできるみたいだね.
補足
私がやってみた例で例えば def addition(a, b: 1, c: 2, **args) abc = a+b+c num = 0 args.each do |key, value| num += value end end p addition (1, b: 2, c: 3, d: 4, e: 5) なんて具合にするとちゃんと走り予想通り 戻り値が15と返ってきました。 不定のキーワード引数なら混在して指定 できるみたいです。 >ちょっと調べた限りでは「混在させること」はできるみたいだね. そのやり方は教えていただけないんですか? 結構自分でも色々試しているんですが、教える 気にならないなら、別にいちいち回答いただか なくても結構ですが。
お礼
生意気すいませんでした。*argsは可変長引数という正式名称なんですね。 http://techracho.bpsinc.jp/baba/2013_02_25/6545 こちらの方の可変長引数とデフォルト引数とキーワード引数を組み合わせるという項目の def test2(id, type='normal', *friends, name: 'unknown', age: 0) puts "name=#{name}, age=#{age}, type=#{type}" puts "id=#{id} friends=#{friends}" end これを試したところ、うまく走りました。 原因がわかりました。 メソッドの引数を定義するときに可変長引数よりキーワード引数を前に出しては いけないという順番の法則みたいなのが存在するようです。 質問の例のdef meth(a, b: 2, c: 3, *args)という部分を(a, *args, b: 2, c: 3) という風に書きかえると、うまく走りました。 デフォルト引数も可変長引数も同じ必須パラメーターとすれば、順位的に必須 パラメーターが先にきてその後にキーワード引数の指定と続くんでしょうか。 せっかく答えて頂いて、不快な思いをさせてしまっていたら申し訳なかったです。 謎が解けました。ありがとうございました。