0

<<すでに初期化されていない限り、配列で使用できないことがわかりました。私は現在、次のように書いています。

unless @app
 @app = my_array
else
 @app << my_array
end 

これを書く良い方法はありますか?

以前は ||= を使っていましたが、

(@app ||= []) << [1,2,3]

[[1, 2, 3]] を返しますが、これは望ましくありません。[1, 2, 3] が欲しい

4

4 に答える 4

5

ここでショートカットを使用できます

(@app ||= []) << xxx

編集:

@app配列を変数にプッシュしたい場合は、次を使用concatする方が良いオプションです。

(@app ||= []).concat [1, 2, 3]
(@app ||= []).concat [4, 5, 6]

@app # => [1, 2, 3, 4, 5, 6]

または、@ ck3g で提案されているように、splat 演算子を使用できます。

于 2013-01-15T06:13:47.177 に答える
2
> (@app ||= []).push *[1, 2, 3]
=> [1, 2, 3]

is " unarray *" 演算子です。

> array = [1, 2, 3]
=> [1, 2, 3]
> [*array]
=> [1, 2, 3]

メソッド<<とメソッドは、複数の引数を取ることができるpushという点で異なります。push

そして、それは単一の値でも機能します:

> (@app2 ||= []).push *1
=> [1]
于 2013-01-15T07:57:03.447 に答える
1

ここに 1 つのイディオムがあります。

@app ||= []
@app << xxx
于 2013-01-15T06:13:52.980 に答える
1

おそらくあなたは << 間違っていますか?<< は、配列のチャンクではなく、配列の要素を意味します。

@app ||= []
@app.concat my_array 
于 2013-01-15T07:59:59.387 に答える