是否有任何方法比较简单的

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用作哈希时将表现为空哈希。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top