Array#[]=的文档说明了
如果index大于数组的当前容量,则为 数组自动增长。
当它自动增长时,它会使用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)更喜欢按行添加数据行。
答案 0 :(得分:3)
使用hash作为数组怎么样?它可能看起来像这样:
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
等等。
P.S。获取数组
h.values #=> ["", "", "", "", "", ""]
答案 1 :(得分: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] = "!"
#=> ["", "!", "!", "", "", "!"]
答案 2 :(得分:1)
我快速浏览了Array
文档,但我没有发现任何有用的内容......
...但是,如果我理解得很清楚,您需要先将空nil
替换""
值,然后再将数据导出到电子表格中。在执行此操作之前,如何在数组的每个元素上调用to_s
?:
arr.map! &:to_s