如果嵌套哈希中不存在密钥,请创建密钥

时间:2014-01-31 17:31:37

标签: ruby-on-rails ruby

我一直在试图弄清楚如何更有说服力地编写这个ruby代码。有人有更好的解决方案吗?

a[:new] = {} if a[:new].nil?
a[:new].merge!( { new_key => new_value } )

有没有办法以更优雅的方式写这个?在处理需要检查密钥是否存在的嵌套哈希时,我遇到了很多,如果不存在,则创建它。

2 个答案:

答案 0 :(得分:1)

Hash#to_hNilClass#to_h

的帮助下,将其写为如下
a[:new] = a[:new].to_h.merge( { new_key => new_value } )

示例:

hsh1[:a] # => nil
hsh1[:a] = hsh1[:a].to_h.merge({1=>2})
hsh1[:a] # => {1=>2}

hsh2 = {:a => {'k' => 2}}
hsh2[:a] # => {"k"=>2}
hsh2[:a] = hsh2[:a].to_h.merge({1=>2})
hsh2 # => {:a=>{"k"=>2, 1=>2}}

答案 1 :(得分:0)

一开始就这样做:

a = Hash.new{|h, k| h[k] = {}}

然后,在不关心a是否有:new键的情况下,做

a[:new].merge!(new_key => new_value)

a[:new][new_key] = new_value