2011-05-12 68 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