7

Array#[] =のドキュメントには、次のように記載されています。

インデックスがアレイの現在の容量よりも大きい場合、アレイは自動的に大きくなります。

それが自動的に成長するとき、それは値でそうしnilます:

arr = []
arr[2] = "!"
arr # => [nil, nil, "!"]

これらの最初の2つの値のデフォルトを指定することは可能ですか?

現在、やっています

arr = []
index = 2
currently_uninitialized_value_range = (arr.length)...(index)
default_values = currently_uninitialized_value_range.map{ "" }
arr[currently_uninitialized_value_range] = default_values
arr[index] = "!"
arr # => ["", "", "!"]

これは少し冗長です。

ハッシュではなく配列を使用しています。これは、スプレッドシートに入力する値を表しているためです。使用しているライブラリ(Axlsx)は、データを行ごとに追加することを好みます。

4

3 に答える 3

3

ハッシュを配列として使用するのはどうですか? 次のようになります。

h = Hash.new do |hash,key|
  0.upto(key) { |i| hash[i] = "" unless hash.has_key?(i) }
end

h[5]
h[0] #=> ""
h[4] #=> ""
h.keys #=> [0, 1, 2, 3, 4, 5]

このアプローチでは、要求を満たすために追加の調整が必要になる場合があります。たとえば、メソッドsizeなどを定義できます。

PS配列を取得する

h.values #=> ["", "", "", "", "", ""]
于 2013-01-07T00:03:48.337 に答える
3

Array#fillあなたのチケットかもしれません。

arr = []

index = 2
arr.fill( "", arr.length...index )
arr[index] = "!"
# => ["", "", "!"]

index = 5
arr.fill( "", arr.length...index )
arr[index] = "!"
# => ["", "", "!", "", "", "!"]

index = 1
arr.fill( "", arr.length...index )
arr[index] = "!"
#=> ["", "!", "!", "", "", "!"]
于 2013-01-07T03:33:42.540 に答える
1

ドキュメントをざっと見てみましたが、Arrayこれに役立つものは何も見つかりませんでした...

...しかし、私がよく理解していれば、データをスプレッドシートにエクスポートする前に、nil値を空の文字列 ( ) に置き換える必要があります。それを行う前に、配列の各要素を""呼び出すのはどうですか?:to_s

arr.map! &:to_s
于 2013-01-07T02:47:54.253 に答える