下面的数组必须将相同的键值与{“狗”=> 11、“猫”=> 3}相加。
animals = [['dogs', 4], ['cats', 3], ['dogs', 7]]当我搜索堆栈溢出时,我找到了下面的答案(我丢失了链接:()
print animals.each_with_object(Hash.new(0)) { |(k, v), h| h[k] += v }然而,我无法在我的脑海中清楚地表明,k,v和h究竟代表着什么。因为"h“保留了块代码的第二个参数,但它与hk保持一致。有人能解释清楚密码吗?
太谢谢你了。
发布于 2017-01-03 06:31:41
简单地说:
animals.each_with_object(Hash.new(0)) do |(key, value), hash|
hash[key] += value
end这里,(k,v)是animals哈希中每对的扩展,这是键值。h表示与此迭代一起传递的“对象”。
就Ruby代码而言,这是一个相当标准的模式。
发布于 2017-01-03 06:35:28
animals.map(&:dup).
group_by(&:shift).
map { |k, v| [k, v.flatten.inject(:+)] }.
to_h
#⇒ {"dogs"=>11, "cats"=>3} 发布于 2017-01-03 06:41:45
与数组一起玩以更好地理解它
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"}https://stackoverflow.com/questions/41437511
复制相似问题