迭代Ruby哈希,意外行为

时间:2013-08-07 19:44:33

标签: ruby

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
  1. 为什么会出现这种情况?
  2. 如何达到预期的行为(获得长度之和)

3 个答案:

答案 0 :(得分:5)

each将接收器哈希转换为数组并迭代它。该迭代的每个元素由两个元素组成的数组:一个键及其对应的值。由于您有四个键值对,因此最多可添加八个。

要获得10,您可以执行以下操作:

r.each do |x|
  count += x.last.length
end

r.each do |_, v|
  count += v.length
end

r.values.flatten.length

答案 1 :(得分:1)

尝试以下方法:

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

Hash#each

  

为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。

答案 2 :(得分:1)

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