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受信者ハッシュを配列に変換し、それを反復処理します。その繰り返しの各要素は、キーとそれに対応する値の 2 つの要素の配列で構成されます。キーと値のペアが 4 つあるため、合計すると 8 つになります。

達成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 のキーごとにブロックを 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 |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 に答える