ruby - Ruby 中的哈希成语的哈希?

标签 ruby idioms hash-of-hashes

在 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/

相关文章:

ruby - 如何只打印键值对中的一个值

ruby - Rails 日期比较;日期大于或等于几天前

mysql - Sequel + Sinatra + Phusion Passenger + MySQL 连接管理

ruby-on-rails - 我如何实现 Hash#all?对于多维哈希?

arrays - Perl 中的多维数组或散列。访问项目

ruby-on-rails - 不允许的参数,嵌套形式 - Ruby On Rails

ruby-on-rails - Ruby 中的 "for x in y"有什么意义?

java - 在 Java 中打印时差的最惯用方法?

perl - 我可以在 Perl 中重命名另一个散列中的散列键吗?

cocoa - 自定义 View 应该如何更新模型对象?