哈希成语在Ruby中的哈希?

在Ruby中创build哈希散列允许方便的两个(或更多)维查找。 但是,插入时必须始终检查散列中是否存在第一个索引。 例如:

h = Hash.new h['x'] = Hash.new if not h.key?('x') h['x']['y'] = value_to_insert 

在自动创build新哈希的情况下,最好执行以下操作:

 h = Hash.new h['x']['y'] = value_to_insert 

同样,当查找第一个索引不存在的值时,如果返回nil,而不是接收未定义的'[]'错误的方法,则会更好。

 looked_up_value = h['w']['z'] 

我们可以创build一个具有这种行为的Hash包装类,但是是否存在一个用于完成此任务的Ruby成语?

您可以传递Hash.new函数一个被执行的块来产生一个默认值,以防被查询的值不存在:

 h = Hash.new { |h, k| h[k] = Hash.new } 

当然,这可以recursion地完成。

/编辑:哇,有一篇文章回答这个问题。

为了完整起见,下面是针对任意深度哈希的文章的解决scheme:

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

数据噪声从积分转到肯特。

正如所谓的自动化,既是祝福也是诅咒。 麻烦的是,如果你在定义之前“看”了一个值,那么你就会陷入这个空的散列,你需要稍后修剪它。

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

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