7

Array#[]=的文档指出

如果索引大于数组的当前容量,则数组会自动增长。

当它确实自动增长时,它会使用nil值:

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

是否可以指定前两个值的默认值?

目前,我正在做

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 回答