如果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
在用作哈希时会表现为空哈希。