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

标签 ruby hash default-value

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

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

关于ruby - 哈希默认值是具有相同默认值的哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34655183/

相关文章:

perl - Perl 中数组的哈希值 : traversal and deletion

Ruby:反斜杠字符串中的所有非字母数字字符

ruby - 如何在 Ruby 中使用 "gets"和 "gets.chomp"

ruby - 有没有类似教程的文章解释如何在 Android 上使用 jRuby?

ruby-on-rails - Rspec.config 之前(:each) except for specific :types

ruby - 如何添加到 Ruby 中的现有哈希

python - 奇怪的 Python 集合和散列行为 - 这是如何工作的?

go - Go 方法中的默认值

c++ - 在函数c++中将变量作为默认参数传递

java - 如何将 String 解析为具有默认值的 int?