アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (2件)

    • good
    • 0
この回答へのお礼

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

お礼日時:2014/11/10 18:49

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

この回答への補足

私がやってみた例で例えば
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と返ってきました。
不定のキーワード引数なら混在して指定
できるみたいです。

>ちょっと調べた限りでは「混在させること」はできるみたいだね.
そのやり方は教えていただけないんですか?
結構自分でも色々試しているんですが、教える
気にならないなら、別にいちいち回答いただか
なくても結構ですが。

補足日時:2014/11/10 17:29
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!