r = {}
r[0] = [1, 2]
r[2] = [1, 2, 4]
r[4] = [1, 2, 5]
r[6] = [1, 2]
count = 0
r.each do |x|
count += x.length
end
puts count #output is 8 expected value is 10
- 为什么会有这种行为?
- 如何达到预期的行为(得到长度的总和)
r = {}
r[0] = [1, 2]
r[2] = [1, 2, 4]
r[4] = [1, 2, 5]
r[6] = [1, 2]
count = 0
r.each do |x|
count += x.length
end
puts count #output is 8 expected value is 10
each
将接收者哈希转换为数组并对其进行迭代。该迭代的每个元素都由一个包含两个元素的数组组成:一个键及其对应的值。由于您有四个键值对,因此加起来是八个。
要10
实现 ,您可以执行以下操作:
r.each do |x|
count += x.last.length
end
或者
r.each do |_, v|
count += v.length
end
或者
r.values.flatten.length
试试下面的:
r = {}
r[0] = [1, 2]
r[2] = [1, 2, 4]
r[4] = [1, 2, 5]
r[6] = [1, 2]
count = 0
r.each do |k,v|
count += v.length
end
puts count
# >> 10
为 hsh 中的每个键调用一次阻塞,将键值对作为参数传递。
在你的情况下:
r = {}
r[0] = [1, 2]
r[2] = [1, 2, 4]
r[4] = [1, 2, 5]
r[6] = [1, 2]
count = 0
r.each do |x|
p x.length,x
end
# >> 2
# >> [0, [1, 2]]
# >> 2
# >> [2, [1, 2, 4]]
# >> 2
# >> [4, [1, 2, 5]]
# >> 2
# >> [6, [1, 2]]
你的每个 x 是一个大小为 2 的数组。现在你的哈希r
有 4 个键,因此4*2
总数为 8。
r
是一个散列,而不是一个数组,所以#each 将键和值提供给块。由于该块只接受一个参数,因此参数以数组的形式给出。
r = {}
r[0] = [1,2,3]
r.each do |x|
p x #=> [0,[1,2,3]]
end
r.each do |key,value|
p key #=> 0
p value #=> [1,2]
end