在 Ruby 中创建散列的散列可以方便地进行二维(或多维)查找。但是,插入时必须始终检查散列中是否已存在第一个索引。例如:
h = Hash.new
h['x'] = Hash.new if not h.key?('x')
h['x']['y'] = value_to_insert
最好在自动创建新哈希的地方执行以下操作:
h = Hash.new
h['x']['y'] = value_to_insert
类似地,当查找第一个索引不存在的值时,返回 nil 比接收 '[]' 错误的未定义方法更好。
looked_up_value = h['w']['z']
可以创建一个具有这种行为的 Hash 包装器类,但是是否存在用于完成此任务的现有 Ruby 习惯用法?
最佳答案
您可以通过 Hash.new
在查询值尚不存在的情况下运行一个 block ,该 block 被执行以产生默认值:
h = Hash.new { |h, k| h[k] = Hash.new }
当然,这可以递归地完成。有 an article explaining the details .
为了完整起见,这里是文章中针对任意深度哈希的解决方案:
hash = Hash.new(&(p = lambda{|h, k| h[k] = Hash.new(&p)}))
最初提出此解决方案的人是 Kent Sibilev .
关于ruby - Ruby 中的哈希成语的哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/170223/