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

Ruby 哈希默认值是具有相同默认值的哈希,ruby,hash,default-value,Ruby,Hash,Default Value,如下所示设置哈希的默认值: hash = Hash.new { |hsh, key| hsh[key] = {} } hash = Hash.new do |hsh, key| hsh[key] = Hash.new { |nest_hsh, nest_key| nest_hsh[nest_key] = {} } end 将为未知密钥创建(并分配)新哈希,但将为所创建哈希的未知密钥返回nil: hash[:unkown_key] #=> {} hash[:unkown_key][:

如下所示设置哈希的默认值:

hash = Hash.new { |hsh, key| hsh[key] = {} }
hash = Hash.new do |hsh, key|
  hsh[key] = Hash.new { |nest_hsh, nest_key| nest_hsh[nest_key] = {} }
end
将为未知密钥创建(并分配)新哈希,但将为所创建哈希的未知密钥返回
nil

hash[:unkown_key] #=> {}
hash[:unkown_key][:nested_unknown] #=> nil
我可以让它在第二层工作,就像这样:

hash = Hash.new { |hsh, key| hsh[key] = {} }
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] #=> {}

您可以创建
方法
,该方法将通过递归实现这一点

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: {}}}}}

有点心不在焉,但您可以将散列传递给内部散列:

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=>{}}}}

一个任意大的数字(你似乎想要的)不是无限(事实上,无限甚至不是一个普通意义上的数字,除非你在谈论亚伯拉罕·罗宾逊意义上的非标准分析)。你似乎把他们弄糊涂了(我在这个网站上看到太多的用户把他们弄糊涂了)。不要把我的
infinity
看得太字面了——当然,这只是夸大了我的问题。我不想让一个数学家认真思考这个问题,如果我这么做了,我很抱歉。哦,顺便说一句,
:无穷大是一个符号,而不是一个数字;-)@Markus我已经用
:n级
替换了
:infinity
,希望这更清楚。我想说的是散列确实嵌套得很深,用
infinity
作为夸张。我认为文字无限多个层次无论如何都是不可能的(我认为会消耗大量内存-无限量内存?;-)。谢天谢地@Stefan为我们清理了一切;-)谢谢,这对我来说是最干净的解决方案!