Ruby中的hash习惯用法的hash?

Ruby中的hash习惯用法的hash?,ruby,idioms,hash-of-hashes,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,而不是接收“[]”错误的未定义方

在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']
可以创建具有此行为的哈希包装类,但是否存在用于完成此任务的Ruby惯用法?

您可以向函数传递一个块,在查询的值尚不存在的情况下执行该块以生成默认值:

h = Hash.new { |h, k| h[k] = Hash.new }
当然,这可以递归地完成。有一个

为了完整起见,以下是本文中针对任意深度散列的解决方案:

hash = Hash.new(&(p = lambda{|h, k| h[k] = Hash.new(&p)}))

最初提出这个解决方案的人是。

自生,顾名思义,既是福也是祸。问题可能是,如果在定义某个值之前“查看”该值,那么您将在插槽中遇到此空哈希,需要稍后将其删除

如果您不介意一点无政府状态,您可以始终插入或等于样式声明,这将允许您在查询时构造预期结构:

((h ||= { })['w'] ||= { })['z']

是否有一组哈希习惯用法在一定深度后返回0?(我在数东西,我用的是h[:foo][:bar][:baz]+=1)死链接。令人印象深刻的解决方案。这里切换了死链接,该链接现在也死了:-(在Internet Archive Wayback机器中有一个指向它的链接。至少该链接会保留一段时间!@Br.Bill确实,谢谢,我已经编辑了它。对于像这样的小更正,请自行执行编辑。
require 'xkeys'
h = {}.extend XKeys::Hash

h['x', 'y'] = value_to_insert
looked_up_value = h['w', 'z'] # nil

h[:foo, :bar, :baz, :else => 0] += 1