5

如何将多个值添加到同一个键?像这样的东西:

x = {}
x["k1"] =  nil
x["k1"] << {"a" => "a"}
x["k1"] << {"b" => "b"}

好吧,这不像数组那样工作。

4

4 回答 4

20

您可以执行以下操作:

作为Arraya 键的值Hash

h = Hash.new{|hsh,key| hsh[key] = [] }
h['k1'].push 'a'
h['k1'].push 'b'
p h # >> {"k1"=>["a", "b"]}

作为Hasha 键的值Hash

h = Hash.new{|hsh,key| hsh[key] = {} }
h['k1'].store 'a',1
h['k1'].store 'b',1
p h # >> {"k1"=>{"a"=>1, "b"=>1}}
于 2013-11-01T15:20:41.147 回答
6

取决于您要在这里完成的工作。如果你想要一个数组的散列,这很容易:

x = {}
x['k1'] = Array.new
x['k1'] << 'a'
x['k1'] << 'b'

或者如果你想要嵌套哈希,也足够简单

x = {}
x['k1'] = {}
x['k1']['a'] = 'a'
x['k1']['b'] = 'b'

散列中的值只是对象。它们可以是数组、其他哈希值或您可能想要的任何其他内容。

于 2013-11-01T14:46:42.167 回答
3

因此,您希望键 'k1' 的值是一个散列,并且您希望将键/值对添加到该散列中。你可以这样做:

2.0.0-p195 :111 > x = {}
 => {} 
2.0.0-p195 :112 > x['k1'] = { 'a' => '1' }
 => {"a"=>"1"} 
2.0.0-p195 :117 > x['k1'].merge!({ 'b' => '2' })
 => {"a"=>"1", "b"=>"2"} 

或者,您可以这样做:

2.0.0-p195 :119 > x['k1']['c'] = 3
 => 3 
2.0.0-p195 :120 > x['k1']
 => {"a"=>"1", "b"=>"2", "c"=>3} 
于 2013-11-01T14:47:16.943 回答
0

简短的回答是你不能:根据定义,哈希键只有一个值。此外,您正在尝试使用 shovel 运算符<<(一种数组方法)来设置值。但即使你使用=了 ,每次你将 key 设置为一个新值,旧值都会丢失:

x = {}
=> {} 
x["k1"] = {"a" => "a"}
=> {"a"=>"a"}
x["k1"] = {"b" => "b"}
=> {"b"=>"b"}

正如其他人指出的那样,如果您想要每个键“几个值”,您应该使用某种集合

x = {}
=> {} 
x["k1"] = {"a" => "a", "b" => "b"}
=> {"a"=>"a", "b"=>"b"}
于 2013-11-01T15:29:07.870 回答