2011-05-12 39 views
0

我在ruby rexml中创建了一个嵌套的哈希,并且想在我进入循环时更新哈希。如何在循环内更新Ruby嵌套散列?

我的代码是这样的:

hash = {} 
doc.elements.each(//address) do |n| 
    a = # ... 
    b = # ... 
    hash = { "NAME" => { a => { "ADDRESS" => b } } } 
end 

当我执行上面的代码中的散列被覆盖和我只在循环的最后一次迭代的信息。

我不想使用下面的方法,因为它使我的代码冗长

hash["NAME"] = {} 
hash["NAME"][a] = {} 

等等...

所以可能有人帮助我如何使这项工作。 ..

回答

0

假设名称是唯一的:

hash.merge!({"NAME" => { a => { "ADDRESS" => b } } }) 
+0

嘿非常感谢你的快速回复..如果我执行上面的代码,它仍然覆盖..变量a和b是独一无二的,但“名称”和“地址”是不同的..所以我是什么在这种情况下.. – sundar 2011-05-12 10:29:51

0

你总是在每个ITER创建一个新的哈希它保存在hash中。

只需直接在现有hash分配的关键:

hash["NAME"] = { a => { "ADDRESS" => b } } 
+0

嘿感谢您的答复..在上面的代码,如果我有更多的嵌套键像哈希[“名称”] = {a => {“ADDRESS”=> b,“PLACE”=> { “COUNTRY”=> d,“REGION”=> e}}然后代码再次变长.. – sundar 2011-05-12 10:43:16

0
hash = {"NAME" => {}} 

doc.elements.each('//address') do |n| 
    a = ... 
    b = ... 
    hash['NAME'][a] = {'ADDRESS' => b, 'PLACE' => ...} 
end 
+0

嗨,如果我有更多的嵌套键然后代码变得太冗长.. – sundar 2011-05-12 11:00:19

+0

是什么使它比你原来的非工作码? – 2011-05-12 14:46:26

0
blk = proc { |hash, key| hash[key] = Hash.new(&blk) } 

hash = Hash.new(&blk) 

doc.elements.each('//address').each do |n| 
    a = # ... 
    b = # ... 
    hash["NAME"][a]["ADDRESS"] = b 
end 

基本上创建散列的懒洋洋地实例化无限重复的哈希值。

编辑:只是想到了可以工作的东西,这只是测试与几个非常简单的哈希,所以可能有一些问题。

class Hash 
    def can_recursively_merge? other 
    Hash === other 
    end 

    def recursive_merge! other 
    other.each do |key, value| 
     if self.include? key and self[key].can_recursively_merge? value 
     self[key].recursive_merge! value 
     else 
     self[key] = value 
     end 
    end 
    self 
    end 
end 

然后在您的代码块中使用hash.recursive_merge! { "NAME" => { a => { "ADDRESS" => b } } }

这只是简单地递归地合并散文和任何其他类型,如果您在其上定义recursive_merge!can_recusively_merge?方法。

+0

嘿,这工作正常,但我想以这种方式创建散列:散列= {“NAME”=> {a => {“ADDRESS”=> b}}}但这不是更新进入循环时的散列。 – sundar 2011-05-13 08:20:03