首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >总结Ruby中相同的键值

总结Ruby中相同的键值
EN

Stack Overflow用户
提问于 2017-01-03 06:16:42
回答 3查看 686关注 0票数 0

下面的数组必须将相同的键值与{“狗”=> 11、“猫”=> 3}相加。

代码语言:javascript
复制
animals = [['dogs', 4], ['cats', 3], ['dogs', 7]]

当我搜索堆栈溢出时,我找到了下面的答案(我丢失了链接:()

代码语言:javascript
复制
print animals.each_with_object(Hash.new(0)) { |(k, v), h| h[k] += v }

然而,我无法在我的脑海中清楚地表明,k,v和h究竟代表着什么。因为"h“保留了块代码的第二个参数,但它与hk保持一致。有人能解释清楚密码吗?

太谢谢你了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-03 06:31:41

简单地说:

代码语言:javascript
复制
animals.each_with_object(Hash.new(0)) do |(key, value), hash|
  hash[key] += value
end

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

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

票数 3
EN

Stack Overflow用户

发布于 2017-01-03 06:35:28

代码语言:javascript
复制
animals.map(&:dup).
        group_by(&:shift).
        map { |k, v| [k, v.flatten.inject(:+)] }.
        to_h
#⇒ {"dogs"=>11, "cats"=>3} 
票数 2
EN

Stack Overflow用户

发布于 2017-01-03 06:41:45

与数组一起玩以更好地理解它

代码语言:javascript
复制
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"}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41437511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档