附加键/值对,用<<在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议使用马克托马斯的答案。