附加键/值对,用<<在Ruby中进行散列

在Ruby中,可以使用<<将值添加到现有数组:

a = [] a << "foo" 

但是,你也可以追加键/值对现有的哈希?

 h = {} h << :key "bar" 

我知道你可以这样做:

 h[:key] = "" h[:key] << "bar" 

但那不是我想要的。

谢谢。

merge!

 h = {} h.merge!(key: "bar") # => {:key=>"bar"} 

由于哈希不是固有的命令,所以没有追加的概念。 不过,从1.9开始,Ruby哈希维护插入顺序。 以下是添加新的键/值对的方法。

最简单的解决scheme是

 h[:key] = "bar" 

如果你想要一个方法,使用store

 h.store(:key, "bar") 

如果你确实想用“shovel”操作符( << ),它实际上是将数组的值附加到数组中,并且必须指定键:

 h[:key] << "bar" 

以上只有当密钥存在时才有效。 要附加一个新的密钥,你必须初始化一个默认值,你可以这样做:

 h = Hash.new {|h, k| h[k] = ''} h[:key] << "bar" 

你可能会试图修补Hash来包含一个铲子操作符,这个操作符按照你所写的方式工作:

 class Hash def <<(k,v) self.store(k,v) end end 

然而,这不会inheritance在其他情况下适用于铲运营商的“语法糖”

 h << :key, "bar" #doesn't work h.<< :key, "bar" #works 

不,我不认为你可以附加键/值对。 我知道的唯一最接近的就是使用store方法:

 h = {} h.store("key", "value") 

也许你想哈希#合并?

 1.9.3p194 :015 > h={} => {} 1.9.3p194 :016 > h.merge(:key => 'bar') => {:key=>"bar"} 1.9.3p194 :017 > 

如果你想改变数组就地使用merge!

 1.9.3p194 :016 > h.merge!(:key => 'bar') => {:key=>"bar"} 

我不得不做类似的事情,但我需要添加相同的键值。 当我使用合并或更新时,我不能推相同的键值。 所以我不得不使用散列数组。

  my_hash_static = {:header =>{:company => 'xx', :usercode => 'xx', :password => 'xx', :type=> 'n:n', :msgheader => from}, :body=>[]} my_hash_dynamic = {:mp=>{:msg=>message, :no=>phones} } my_hash_full = my_hash_static[:body].push my_hash_dynamic 

就像它们一样, merge! 并根据关键字来store不同的现有哈希值,因此会影响您的偏好。 除了从语法的angular度来看, merge! key: "value"语法与JavaScript和Python紧密匹配。 我一直都非常喜欢用逗号分隔键值对。

 hash = {} hash.merge!(key: "value") hash.merge!(:key => "value") puts hash 

{:key=>"value"}

 hash = {} hash.store(:key, "value") hash.store("key", "value") puts hash 

{:key=>"value", "key"=>"value"}

为了让铲运营商工作,我build议使用马克托马斯的答案。