使用<<附加键/值对来哈希在Ruby中

时间:2013-11-03 18:03:49

标签: ruby hash

在Ruby中,可以使用<<:

将值附加到现有数组
a = []
a << "foo"

但是,您是否还可以将键/值对附加到现有哈希?

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

我知道你可以这样做:

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

但那不是我想要的。

感谢。

6 个答案:

答案 0 :(得分:120)

merge!

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

答案 1 :(得分:73)

由于散列本身并不是有序的,因此没有附加的概念。但是,1.9以来的Ruby哈希值维持了插入顺序。以下是添加新键/值对的方法。

最简单的解决方案是

h[:key] = "bar"

如果您需要方法,请使用store

h.store(:key, "bar")

如果你确实想要使用“铲”运算符(<<),它实际上是将哈希的值附加为数组,并且必须指定键:

h[:key] << "bar"

以上仅在密钥存在时才有效。要附加新密钥,您必须使用默认值初始化哈希值,您可以这样做:

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

你可能想要修补哈希,以包括一个以你写的方式工作的铲子操作员:

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

但是,这并没有继承在其他情况下应用于铲运算符的“语法糖”:

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

答案 2 :(得分:24)

不,我认为你不能追加键/值对。我所知道的唯一最接近的是使用store方法:

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

答案 3 :(得分:3)

也许你想要Hash#merge?

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"} 

答案 4 :(得分:1)

我必须做类似的事情,但我需要使用相同的键添加值。当我使用合并或更新时,我无法使用相同的键推送值。所以我不得不使用哈希数组。

    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

答案 5 :(得分:1)

与它们类似,merge!store根据键名对现有哈希值进行区分,因此会影响您的偏好。除了语法观点之外,merge!的{​​{1}}语法与JavaScript和Python紧密匹配。我个人总是讨厌用逗号分隔键值对。

key: "value"
  

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"}正常工作,我建议使用Mark Thomas的答案。