【发布时间】:2021-04-21 16:08:18
【问题描述】:
我正在尝试创建一个哈希,其中键是数字,值是来自两个数组的计数的数组 [0,0]。
我很困惑的是为什么my_hash2.store(x,my_hash2[x][1]+1) 不更新我的计数。
my_hash2 = Hash.new{|h,k| h[k] = [0,0]}
[12,12,13,14,15,16].each do |x|
my_hash2[x][0] += 1
end
puts my_hash2 # => {12=>[2, 0], 13=>[1, 0], 14=>[1, 0], 15=>[1, 0], 16=>[1, 0]}
[12,12,13].each do |x|
my_hash2.store(x,my_hash2[x][1]+1)
end
puts my_hash2 # => {12=>1, 13=>1, 14=>[1, 0], 15=>[1, 0], 16=>[1, 0]}
puts my_hash2[12][0] #=> 1
puts my_hash2[12][1] #=> 0
【问题讨论】:
-
当
x等于12和my_hash2等于{12=>[2, 0], 13=>[1, 0], 14=>[1, 0], 15=>[1, 0], 16=>[1, 0]},my_hash2.store(x,my_hash2[x][1]+1)--通常写成my_hash2[x] = my_hash2[x][1]+1--导致my_hash2的值,对于key12从[2, 0]更改为my_hash2[12][1]+1,等于0 + 1 #=> 1。这解释了为什么您会得到不想要的结果。 -
我猜你可能想要
{12=>[2, 0], 13=>[1, 0], 14=>[1, 0], 15=>[1, 0], 16=>[1, 0]}.transform_values { |v1,v2| [v1+1, v2+1] } #=> {12=>[3, 1], 13=>[2, 1], 14=>[2, 1], 15=>[2, 1], 16=>[2, 1]}。见Hash#transform_values。 -
您可以将前 4 行替换为
[12,12,13,14,15,16].tally.transform_values { |n| [n,0] } #{12=>[2, 0], 13=>[1, 0], 14=>[1, 0], 15=>[1, 0], 16=>[1, 0]}。中间计算是[12,12,13,14,15,16].tally #=> {12=>2, 13=>1, 14=>1, 15=>1, 16=>1}。请参阅Enumerable#tally,它在 Ruby v2.7.0 中首次亮相。 -
感谢@CarySwoveland 的评论