使用首选默认值展开数组
Posted
技术标签:
【中文标题】使用首选默认值展开数组【英文标题】:Expand array with preferred default 【发布时间】:2012-12-20 16:52:51 【问题描述】: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) 更喜欢按行添加数据行。
【问题讨论】:
arr = Array.new(2, '') # => ["", ""]; arr[2] = "!"; arr => ["", "", "!"]
。至少如果您只想初始化前 n 个元素。
@BernardK Array.new(2), ''
比 Array.new(2, '')
更安全。请参阅 rdoc 中 Array.new 的“常见问题”。
【参考方案1】:
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】:使用散列作为数组怎么样?它可能看起来像这样:
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
等等。
附:获取数组
h.values #=> ["", "", "", "", "", ""]
【讨论】:
如何将值从这个散列传递到需要值数组的库方法? 如何定义方法 to_a 将带来所需的格式?【参考方案3】:我快速浏览了Array
文档,但没有发现任何有用的信息...
...但如果我理解得很好,您需要先将 nil
值替换为空字符串 (""
),然后才能将数据导出到电子表格。在此之前对数组的每个元素调用to_s
怎么样?:
arr.map! &:to_s
【讨论】:
以上是关于使用首选默认值展开数组的主要内容,如果未能解决你的问题,请参考以下文章