まず、ここでは優先順位は問題ではありませんfoo = bar || (*zap)。一般的な経験則では、スプラットに対して追加の操作を実行することはできません。単純なものでもfoo = (*zap)無効です。これは 1.9 にも当てはまります。
foo = bar || *zapそうは言っても、それが機能した場合、それは とは異なり、何をすることを期待していますfoo = bar || zapか? a, b = bar || *zap(これも機能しません)のような場合でもa, b = bar || zap、同じことであると私が想定していることを達成します。
これが意味を成す唯一の状況は、次のようなものa, b = foo, bar || *zapです。これを使用したいほとんどの場合は、 でカバーされていることがわかるはずですa, b = foo, *(bar || zap)。それがあなたの場合をカバーしていない場合は、おそらく、そのような醜い構造を書くことによって何を達成したいのかを自問する必要があります.
編集:
あなたのコメントに応えて、*zap || barは と同等*(zap || bar)です。これは、スプラットの優先順位がいかに低いかを示しています。具体的にどれくらい低いの?私があなたに与えることができる最良の答えは、「かなり低い」です。
ただし、興味深い例として、foo3 つの引数を取るメソッドを考えてみましょう。
def foo(a, b, c)
#important stuff happens here!
end
foo(*bar = [1, 2, 3])代入後にスプラットし、引数をそれぞれ 1、2、および 3 に設定します。foo((*bar = [1, 2, 3]))引数の数が間違っている (3 に対して 1) と文句を言う which と比較してください。