1

arayの使用方法に基づいてインデックスがさらに配列に入るように、nilを入れたい配列がいくつかあります。より速く、より効率的でエレガントな方法はありますか?

(1..@epgroup_overide_count.to_i).each do 
    @grp['Overides'].unshift(nil)
    @grp['channel_overides'].unshift(nil)
end
4

2 に答える 2

2

#unshift複数の要素を先頭に追加するために分割された引数リストを使用するため、次のようになります。

@group['Overides'].unshift(*([nil]*@epgroup_override_count.to_i))

これで完了です(2番目のものと同様)


ワンライナーを分解する:

[nil] * @epgroup_override_count.to_i

配列に数値を掛けると、その数だけ配列が複製されますが、単一のフラットな配列 ( [1,2,3]*3 #=> [1,2,3,1,2,3,1,2,3]) になります。注意すべきことの 1 つは、配列に変数参照がある場合、重複ではなく、同じオブジェクトへの複数の参照が作成されることです。

*(above_multiplied_array)

splat 演算子を使用して、配列をメソッドの引数に広げます

arr.unshift(multiple, args, here)

splat 演算子を使用して、配列を複数の args に展開し#unshiftます。に#unshift複数の引数が与えられると、それらすべてが配列の前に追加されます。これは望ましい結果です。

于 2013-01-31T18:26:13.770 に答える
0

以下のようにすることができます:

 @grp['Overides'] +=([nil]*@epgroup_override_count.to_i).flatten
 @grp['channel_overides'] += ([nil]*@epgroup_override_count.to_i).flatten

 or

 nil_array = ([nil]*@epgroup_override_count.to_i).flatten
 @grp['Overides'] += nil_array
 @grp['channel_overides'] += nil_array 
于 2013-01-31T18:44:21.707 に答える