• ベストアンサー

メソッド定義の際の引数で

楽しい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で括った瞬間に エラーが返りましたんで、きっとこれが原因だと 思うのですが。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2
noname#208914
質問者

お礼

生意気すいませんでした。*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) という風に書きかえると、うまく走りました。 デフォルト引数も可変長引数も同じ必須パラメーターとすれば、順位的に必須 パラメーターが先にきてその後にキーワード引数の指定と続くんでしょうか。 せっかく答えて頂いて、不快な思いをさせてしまっていたら申し訳なかったです。 謎が解けました。ありがとうございました。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

ちょっと調べた限りでは「混在させること」はできるみたいだね.

noname#208914
質問者

補足

私がやってみた例で例えば 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と返ってきました。 不定のキーワード引数なら混在して指定 できるみたいです。 >ちょっと調べた限りでは「混在させること」はできるみたいだね. そのやり方は教えていただけないんですか? 結構自分でも色々試しているんですが、教える 気にならないなら、別にいちいち回答いただか なくても結構ですが。

関連するQ&A

専門家に質問してみよう