2008-10-04 264 views
34

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

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

这将是可取的地方,会自动创建新的Hash做到以下几点:

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

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

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

可以创建一个具有此行为的哈希包装类,但是是否存在用于完成此任务的现有Ruby成语?

+0

是否有一个哈希散列成语在特定深度之后会返回0吗? (我计数的东西和我使用H [:FOO] [:巴] [:巴兹] + = 1) – 2010-01-11 00:15:32

回答

54

您可以通过Hash.new功能被执行产生的情况下,查询的值不存在默认值的模块:

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

。当然,这是可以完成递归。

/编辑:哇,有an article回答过这个问题。

为了完整起见,这里是从文章的解决方案,任意深度的哈希值:

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

现金去肯特从Data Noise

+1

哇。这很让人佩服。 – 2009-12-02 09:28:26

4

自动激活,因为它叫,既是祝福和诅咒。该故障可能,如果你“看”它被定义之前的值,你就完蛋了与插槽这个空哈希,你会需要在以后进行清理,关闭。

如果你不介意有点混乱,你永远可以在或-等于样式声明,这将使你构建预期的结构,你查询它果酱:

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