如果hash 不存在,如何分配hash =’c’?

有什么比这简单的方法

if hash.key?('a') hash['a']['b'] = 'c' else hash['a'] = {} hash['a']['b'] = 'c' end 

最简单的方法是使用块参数构造Hash :

 hash = Hash.new { |h, k| h[k] = { } } hash['a']['b'] = 1 hash['a']['c'] = 1 hash['b']['c'] = 1 puts hash.inspect # "{"a"=>{"b"=>1, "c"=>1}, "b"=>{"c"=>1}}" 

这个new表单创建一个新的空Hash作为默认值。 你不想要这个:

 hash = Hash.new({ }) 

因为它将对所有默认条目使用完全相同的哈希值。

另外,正如Phrogz所说,你可以使用default_proc使自动生成的哈希自动生成:

 hash = Hash.new { |h, k| h[k] = Hash.new(&h.default_proc) } 

更新 :我想我应该澄清我对Hash.new({ })警告。 当你这样说时:

 h = Hash.new({ }) 

这就像说:

 h = Hash.new h.default = { } 

然后,当您访问h以指定h[:k][:m] = y ,它的行为就像您这样做:

 if(h.has_key?(:k)) h[:k][:m] = y else h.default[:m] = y end 

然后,如果你h[:k2][:n] = z ,你最终会分配h.default[:n] = z 。 注意, h仍然说h.has_key?(:k)是假的。

但是,当你这样说时:

 h = Hash.new(0) 

一切都会好起来因为你永远不会在这里修改h[k] ,你只会从h读取一个值(必要时会使用默认值)或者为h赋值。

一个简单的,但哈希应该是一个有效的哈希对象

 (hash["a"] ||= {})['b'] = "c" 

如果您创建hash如下,默认值为新的(默认值相同)哈希:(感谢Phrogz的更正;我的语法错误)

 hash = Hash.new{ |h,k| h[k] = Hash.new(&h.default_proc) } 

那你可以做

 hash["a"]["b"] = "c" 

没有任何额外的代码。

这里的问题是 : 在Ruby中是否可以自动初始化多维哈希数组,就像在PHP中一样? 提供了一个非常有用的AutoHash实现。

 class NilClass def [](other) nil end end 

一旦你定义了,一切都会自动生效。 但请注意,从现在开始, nil在用作哈希时会表现为空哈希。