ruby – 在inject方法中初始化一个哈希,以防止值为nil
发布时间:2020-12-17 01:43:35 所属栏目:百科 来源:网络整理
导读:我正在尝试编译哈希列表中给定哈希键的所有值.我有以下工作. [{'a': 1,'b': 2,'c': 3},{'a': 4,'b': 5,'c': 6},{'a': 7,'b': 8,'c': 9}].inject({}) do |hash,item| item.each do |key,value| hash[key] = [] if hash[key].nil? hash[key] value end hashend
我正在尝试编译哈希列表中给定哈希键的所有值.我有以下工作.
[{'a': 1,'b': 2,'c': 3},{'a': 4,'b': 5,'c': 6},{'a': 7,'b': 8,'c': 9}].inject({}) do |hash,item| item.each do |key,value| hash[key] = [] if hash[key].nil? hash[key] << value end hash end 这是伟大的结果: {:a=>[1,4,7],:b=>[2,5,8],:c=>[3,6,9]} 我的问题:是否有更优雅的方式来初始化哈希,所以我不需要检查以下行中的nil情况? hash[key] = [] if hash[key].nil? 我已经尝试将Hash.new(0)作为inject方法的默认值,但它不起作用.我确信有更优雅的方式来做到这一点.谢谢. 解决方法
解决方案
你可以使用each_with_object: array = [{'a': 1,'c': 9}] empty_hash = Hash.new{ |h,k| h[k] = [] } hash = array.each_with_object(empty_hash) do |small_hash,hash| small_hash.each do |k,v| hash[k] << v end end p hash #=> {:a=>[1,9]} 这里有一个更短但更不寻常的版本: hash = array.each_with_object(Hash.new{ [] }) do |small_hash,hash| small_hash.each {|k,v| hash[k] <<= v } end p hash #=> {:a=>[1,9]} 对于[{a:1},{b:2}],返回{:a => [1],:b => [2]},作为指定的OP. << =? hash [k]<< = v是一种奇怪的(也可能是低效的)技巧.它相当于: hash[k] = (hash[k] << v) 需要进行赋值,因为哈希默认值尚未正确初始化,并且正在为每个哈希查找生成一个新数组,而不保存为值: h = Hash.new{ [] } p h[:a] << 1 #=> [1] p h[:a] #=> [] p h[:a] <<= 1 #=> [1] p h[:a] #=> [1] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 如何删除WPF(C#)中Expander控件头部的虚线轮廓?
- WinForm实现页面按钮定时隐藏功能
- c – UDP sendto()和recvfrom()最大缓冲区大小
- C#:AES错误:填充无效,无法删除.相同的钥匙和一切,帮助
- PNP管理器简析--基于ReactOS0.33
- [PWA] Customize the Splash Screen of a PWA built with c
- Cocos2d-x多场景切换生命周期
- 常用正则表达式大全!(例如:匹配中文、匹配html)
- 为什么(Poignant)Ruby指南:我在哪里可以找到一个有效的pre
- 非常实用的C#字符串操作处理类StringHelper.cs