【问题标题】: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 的“常见问题”。

标签: ruby arrays default-value


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 2019-11-02
      • 2011-08-30
      • 2013-07-19
      • 2013-06-19
      相关资源
      最近更新 更多