Ruby数组在读取时初始化

时间:2017-01-27 17:19:27

标签: ruby

我希望能够做到这一点:

my_array = Array.new
my_array[12] += 1

换句话说,不知何故,在尝试访问条目12时,发现它未初始化,它被初始化为零,因此我可以添加一个。 Array.new有一个default:参数,但是在使用已知插槽数初始化数组时会发挥作用。除了写自己的课程外,还有一种红宝石的方法吗?

5 个答案:

答案 0 :(得分:4)

无需创建新类:

my_hash = Hash.new(0)
my_hash[12] += 1
p my_hash
#=> {12=>1}

对于许多情况,哈希和数组可以互换使用。 具有任意数量元素和默认值的数组听起来像是哈希;)

为了说清楚:HashArray不相同。在某些情况下,使用哈希而不是数组将是完全错误的。

答案 1 :(得分:3)

类似的东西:

a[12] = (a[12] ||= 0) + 1

答案 2 :(得分:1)

利用nil.to_i == 0

my_array = Array.new
my_array[12] = my_array[12].to_i + 1

答案 3 :(得分:0)

请注意,与目前为止的其他解决方案不同,此解决方案适用于任意初始值。

my_array = Array.new.extend(Module.new {
  def [] idx
    super || 0
  end
})
my_array[12] += 1
#⇒ 1

答案 4 :(得分:0)

使用库存Array::new方法无法做到这一点。

https://docs.ruby-lang.org/en/2.0.0/Array.html#method-c-new

您需要使用补丁Array类或猴子补丁nil类。并且不推荐它们。

如果您有特定用例,我会围绕Array

创建一个新的包装器类
class MyArray < Array
  def [](i)
    super(i) ? super(i) : self[i] = 0
  end
end

arr = MyArray.new
arr[12] += 1 # => 1