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?
на них.