Ruby .store 函数将散列值从数组更改为单个值

Ruby .store function changes hash values from array to single value

我正在尝试创建一个散列,其中键是数字,值是来自两个数组的计数数组 [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

.store将value给的值和key给的key关联起来。 (根据文档 https://apidock.com/ruby/Hash/store

所以这意味着您的密钥存储的任何值都将被新值替换。

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|
    # in the first run in case of 12 this replaces your [2, 0] with 1 because current value of my_hash2[12][1] is 0 and 0 + 1 is 1
    # in the second run we also get 12 but my_hash2[12] is 1 now. and 1[1] equals 0. You are here essentially doing my_hash[12] = 1[1] + 1 = 0 + 1 and it correctly gives you 1
    # in the third run it operates on my_hash2[13][1] but same rules apply
    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] #=> 1
puts my_hash2[12][0] #=> 1
puts my_hash2[12][1] #=> 0

因此您需要不使用 .store 或更改此行:

my_hash2.store(x,my_hash2[x][1]+1)

至:

new_val = [my_hash[x][0], my_hash[x][1]+1]
my_hash2.store(x, new_val)

奇怪的是为什么像 1[0] 这样的事情会给你 11[1] 会给你 0 (并且不会引发任何错误)

答案又在文档中:)

https://ruby-doc.org/core-2.5.0/Integer.html#method-i-5B-5D

int[n] → 0, 1

Bit Reference—Returns the nth bit in the binary representation of int, where int[0] is the least significant bit.

这意味着如果我们将 1 转换为位表示,那么我们将继续从该表示中获取第 n 位。 1 在 0 位上有一个位,所有其他位置(所以 1,2,3,4...)都是 0。这就是为什么 1[0] 给你 1 但 1[1] 或 1[3] 会给你 0.