0

我正在 ruby​​ rexml 中创建一个嵌套哈希,并希望在我进入循环时更新哈希。

我的代码是这样的:

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

当我执行上面的代码时,哈希被覆盖,我只得到循环最后一次迭代中的信息。

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

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

等等...

那么有人可以帮助我如何完成这项工作......

4

4 回答 4

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

doc.elements.each('//address') do |n|
  a = ...
  b = ...
  hash['NAME'][a] = {'ADDRESS' => b, 'PLACE' => ...}
end
于 2011-05-12T10:51:33.997 回答
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!andcan_recusively_merge?方法)。

于 2011-05-12T11:31:26.683 回答
0

假设名称是唯一的:

hash.merge!({"NAME" => { a => { "ADDRESS" => b } } })
于 2011-05-12T10:17:18.877 回答
0

你总是在每次迭代中创建一个新的哈希,它保存在hash.

只需直接在现有的中分配密钥hash

hash["NAME"] = { a => { "ADDRESS" => b } }
于 2011-05-12T10:18:54.830 回答