我希望能够做到这一点:
my_array = Array.new
my_array[12] += 1
换句话说,不知何故,在尝试访问条目12时,发现它未初始化,它被初始化为零,因此我可以添加一个。 Array.new有一个default:参数,但是在使用已知插槽数初始化数组时会发挥作用。除了写自己的课程外,还有一种红宝石的方法吗?
答案 0 :(得分:4)
无需创建新类:
my_hash = Hash.new(0)
my_hash[12] += 1
p my_hash
#=> {12=>1}
对于许多情况,哈希和数组可以互换使用。 具有任意数量元素和默认值的数组听起来像是哈希;)
为了说清楚:Hash
和Array
不相同。在某些情况下,使用哈希而不是数组将是完全错误的。
答案 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