0
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. 如何达到预期的行为(得到长度的总和)
4

3 回答 3

5

each将接收者哈希转换为数组并对其进行迭代。该迭代的每个元素都由一个包含两个元素的数组组成:一个键及其对应的值。由于您有四个键值对,因此加起来是八个。

10实现 ,您可以执行以下操作:

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

或者

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

或者

r.values.flatten.length
于 2013-08-07T19:47:18.307 回答
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

哈希#每个

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

于 2013-08-07T19:46:12.783 回答
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
于 2013-08-07T19:48:11.947 回答