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.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 に答える
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?します。

于 2011-05-12T11:31:26.683 に答える
0
hash = {"NAME" => {}}

doc.elements.each('//address') do |n|
  a = ...
  b = ...
  hash['NAME'][a] = {'ADDRESS' => b, 'PLACE' => ...}
end
于 2011-05-12T10:51:33.997 に答える