使用首选默认值展开数组

时间:2013-01-06 23:14:53

标签: ruby arrays default-value

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)更喜欢按行添加数据行。

3 个答案:

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