18

スプラットはクールです。それは楽しいですが、それらは配列を爆発させるためだけのものではありません。また、配列にキャストして配列をフラット化することもできます (機能の完全なリストについては、 http: //github.com/mischa/splat/tree/masterを参照してください)。

スプラットで追加の操作を実行できないように見えますが、1.8.6/1.9 では次のコードで「予期しない tSTAR」がスローされます。

foo = bar || *zap #=> unexpected tSTAR

これは機能しますが:

foo = *zap || bar #=> works, but of limited value

感嘆符は式のどこに表示できますか?

4

2 に答える 2

15

まず、ここでは優先順位は問題ではありません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 と比較してください。

于 2009-04-22T14:46:21.067 に答える
9

「splat 演算子」は実際には演算子ではなく、Ruby 文法で定義されたトークンです。grammar.y または Ruby grammar in BNF form* を読むと、最後の引数または唯一の引数として許可されていることがわかります。

  • メソッド定義 (オプションの last を除く&foo)
  • メソッド呼び出し (オプションの last を除く&foo)
  • as 割り当ての LHS で、たとえば次のようになります。a, b, *cs = [1,2,3,4]
  • 割り当ての RHS で、たとえば次のようになります。a, b, c = 1, 2, *[3,4,5]
  • case ステートメントの when 節で
于 2011-04-08T18:04:02.497 に答える