哈希默认值是具有相同默认值的哈希

像这样设置哈希的默认值:

hash = Hash.new { |hsh, key| hsh[key] = {} } 

将为未知密钥创建(并分配)新哈希,但对于创建的哈希的未知密钥将返回nil

 hash[:unkown_key] #=> {} hash[:unkown_key][:nested_unknown] #=> nil 

我可以让它适用于第二级,如下所示:

 hash = Hash.new do |hsh, key| hsh[key] = Hash.new { |nest_hsh, nest_key| nest_hsh[nest_key] = {} } end 

但是,它在第​​三级不起作用:

 hash[:unkown_key][:nested_unknown] #=> {} hash[:unkown_key][:nested_unknown][:third_level] #=> nil 

如何让它在任意级别工作?

 hash[:unkown_key][:nested_unknown][:third_level][...][:nth_level] #=> {} 

思维弯曲的类型,但您可以将哈希的default_proc传递给内部哈希:

 hash = Hash.new { |h, k| h[k] = Hash.new(&h.default_proc) } hash[:foo] #=> {} hash[:foo][:bar] #=> {} hash[:foo][:bar][:baz] #=> {} hash #=> {:foo=>{:bar=>{:baz=>{}}}} 
 bottomless_hash = ->() do Hash.new { |h, k| h[k] = bottomless_hash.call } end hash = bottomless_hash.call hash[:unkown_key][:nested_unknown][:third_level][:fourth] # => {} 

您可以创建使用Recursion执行此操作的method

 class Hash def self.recursive new { |hash, key| hash[key] = recursive } end end hash = Hash.recursive hash[:unknown_key] # => {} hash[:first_unknown_key][:second_unknown_key][...][:infinity] # hash => {first_unknown_key: {second_unknown_key: {... {infinity: {}}}}}