13

splat 引数にデフォルト値を設定すると、エラーが発生します。

1.9.3-p374 :001 > def a b, *c = nil
1.9.3-p374 :002?>   end
SyntaxError: (irb):1: syntax error, unexpected '=', expecting ';' or '\n'
def a b, *c = nil
             ^
    from /Users/me/.rvm/rubies/ruby-1.9.3-p374/bin/irb:16:in `<main>'

私が試したいくつかのバリエーションも機能しません:

1.9.3-p374 :003 > def a b, *c = []
1.9.3-p374 :005 > def a b, (*c) = nil
1.9.3-p374 :007 > def a b, (*c = [])
1.9.3-p374 :009 > def a b, (*c = [1,2,3])
1.9.3-p374 :011 > def a b, *c = [1,2,3]

ここでは不確定性の問題は見られないので、可能であるように思われます。

関連: Ruby 1.9 のメソッド定義で、非明示的なスプラット パラメータとデフォルト パラメータが間違った構文であるのはなぜですか?

4

4 に答える 4

6

あなたの試みた使用法は、スプラットの使用法に関する慣習に反しています。スプラットは (少なくとも Ruby では) すべての余分な(0、1、またはそれ以上の) 値を取ると想定されています。

メソッド引数リストの 2 番目の値にデフォルト値を設定することがわかっている場合は、それをスプラットから取り出して、スプラットの直前に次のようなデフォルト値でリストすることができます。

def a b, c=nil, *d 
  # rest of code omitted
end

編集: なぜそれがうまくいかないのかというあなたの質問に対する答えを完全に明確にするため。これは、言語設計者による設計上の決定です。Matz は、splat オペレーターがデフォルトで動作することを決して意図していませんでした。これは、不確定な数の変数をキャッチするために使用することを目的としており、説明した方法はあなたが説明した可能性よりも明確に読み取れるため、そしてあなたの例が解決するすべての問題は他の方法で解決できるため、私にはかなり賢明に思えます。

于 2013-04-03T20:26:20.730 に答える
4

デフォルトのスプラットが空の配列を返すことを知っていれば、メソッド自体にデフォルト値を設定できます。

def test(a, *b)
  b = "default b" if b == [] # edited as per Tin Man's recommendation
  puts [a, b].inspect
end

test("Test", 1, 2)
# => ["Test", [1, 2]]
test("Test")
# => ["Test", "default b"]

b.present?Rails では、空の配列が空白と見なされることを確認できます。それが役立つことを願っています。

于 2013-04-03T20:28:45.540 に答える