こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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

投稿日時 - 2014-11-10 16:13:38

QNo.8820326

困ってます

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

ん? たとえば
http://magazine.rubyist.net/?0041-200Special-kwarg
とか
http://techracho.bpsinc.jp/baba/2013_02_25/6545
くらいは見つかるんだが?

投稿日時 - 2014-11-10 18:14:20

お礼

生意気すいませんでした。*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:31

ANo.2

このQ&Aは役に立ちましたか?

6人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

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

投稿日時 - 2014-11-10 17:06:40

補足

私がやってみた例で例えば
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:47