如何分配哈希["a"]["b"]='c'如果哈希["a"]不存在?
-
28-10-2019 - |
题
是否有任何方法比较简单的
if hash.key?('a')
hash['a']['b'] = 'c'
else
hash['a'] = {}
hash['a']['b'] = 'c'
end
解决方案
最简单的方法是 构造你的散列 有一个方框的说法:
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.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
,并使用新值(默认值是默认值)的默认哈希值:(感谢Phrogz进行更正;我的语法错误)
通用标签
那你就可以做 通用标签
没有任何其他代码。
这里的问题:
像PHP一样,在Ruby中是否可以自动初始化多维哈希数组?
提供了一个非常有用的AutoHash
实现。
通用标签
一旦定义,一切将自动运行。但是请注意,从现在开始,nil
用作哈希时将表现为空哈希。
不隶属于 StackOverflow