在Ruby

时间:2017-01-03 06:16:43

标签: arrays ruby hash key

我有下面的数组,必须总结与{'狗' => 11,'猫' => 3}。

animals = [['dogs', 4], ['cats', 3], ['dogs', 7]]

我在stackoverflow上搜索时找到了以下答案(我丢失了链接:()

print animals.each_with_object(Hash.new(0)) { |(k, v), h| h[k] += v }

但是我无法在脑海中清楚地知道k,v和h的确切代表什么。因为" h"保留了区块代码的第二个参数,但它仍然是h [k]。任何人都可以清楚地解释这些代码吗?

太多了。

3 个答案:

答案 0 :(得分:3)

简单来说:

animals.each_with_object(Hash.new(0)) do |(key, value), hash|
  hash[key] += value
end

此处(k,v)animals哈希中每对的扩展,即键值h表示与此迭代一起传递的“对象”。

就Ruby代码而言,这是一个相当标准的模式。

答案 1 :(得分:2)

animals.map(&:dup).
        group_by(&:shift).
        map { |k, v| [k, v.flatten.inject(:+)] }.
        to_h
#⇒ {"dogs"=>11, "cats"=>3} 

答案 2 :(得分:1)

使用数组来更好地理解

animals.each {|arr| puts arr.inspect }
# ["dogs", 4]
# ["cats", 3]
# ["dogs", 7]

animals.each {|k, v| puts "k -> #{k}, v -> #{v}" }
# k -> dogs, v -> 4
# k -> cats, v -> 3
# k -> dogs, v -> 7

animals.each_with_object({}) do |(k, v), h| 
  puts "k -> #{k}, v -> #{v}, h -> #{ h.inspect }"
end
# k -> dogs, v -> 4, h -> {}
# k -> cats, v -> 3, h -> {}
# k -> dogs, v -> 7, h -> {}

animals.each_with_object({}) do |(k, v), h|
  h[v] = k
  puts "k -> #{k}, v -> #{v}, h -> #{ h.inspect }"
end
# k -> dogs, v -> 4, h -> {4=>"dogs"}
# k -> cats, v -> 3, h -> {4=>"dogs", 3=>"cats"}
# k -> dogs, v -> 7, h -> {4=>"dogs", 3=>"cats", 7=>"dogs"}