2

data_dummy ハッシュの値が増加するのはなぜですか? これを使用して、値がゼロの別のハッシュを開始したいと思います!

fau[f.label][:hash] = data_dummy #  ==>{"name 1" => 0, "name 2" => 0} but in the second loop it contains data from the first loop e.g. {"name 1" => 2, "name 2" => 0}

変数 dummy_data の代わりに文字列を使用すると、コードは期待どおりに機能します。

fau[f.label][:hash] = {"name 1" => 0, "name 2" => 0} 

「名前X」が変わるので、それはできません....

それは私には奇妙です!

完全なコード

fau = {}
series = []
labels = [{:value => 0, :text => ''}]

data_dummy = {}
source.each do |c|
  data_dummy[c.name] = 0
end
i = 0
data_dummy.each do |k,v|
  i += 1
  labels.push({:value => i, :text => k})
end

source.each do |s|
  logger.debug "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
  logger.debug "Source: '#{s.name}'|'#{fault_labels[s.fault_id.to_s].label}' => #{s.cnt}"
  con_name = s.name #TODO: Cut name (remove location like left,right, ...)
  f = fault_labels[s.fault_id.to_s]
  unless fau.has_key?(f.label)
    # init faults-hash 'fau'
    fau[f.label] = {:total => 0, :hash => {}, :color => f.color, :name => f.label} #, :data => []
    # add all connector_names as keys with value = 0
    logger.debug "init :hash with #{data_dummy}" #  ==>{"name 1" => 0, "name 2" => 0} but in the second loop it contains data from the first loop e.g. {"name 1" => 2, "name 2" => 0}
    fau[f.label][:hash] = data_dummy
    # this way the number of incidents are all in the same order for each fault (first dimension key)
    # and all get at least a value of 0
 end
  logger.debug "Count up fau['#{f.label}'][:total] = #{fau[f.label][:total]} + #{s.cnt} (where connector '#{s.name}' and fault '#{f.label}')"
  logger.debug "Count up fau['#{f.label}'][:hash]['#{con_name}'] = #{fau[f.label][:hash][con_name]} + #{s.cnt}"
  fau[f.label][:total] += s.cnt
  fau[f.label][:hash][con_name] += s.cnt
  logger.debug "result :hash with #{fau[f.label][:hash].inspect}}"
end
4

2 に答える 2

5

Ruby ハッシュは、すべての Ruby オブジェクトと同様に参照hash2 = hash1であり、参照のコピーのみを作成するなど、1 つをコピーするためです。hash2 を変更すると、hash1 が変更されます。実際には、これらは同じものの別のエイリアスにすぎません。

代わりに clone メソッドを使用します。

hash2 = hash1.clone

Ruby でハッシュをコピーするにはどうすればよいですか?も参照してください。

これでも浅いコピーしか作成されないことに注意してください。ネストされたハッシュ ( などmyhash = {"key1" => "value1", "key2" => {"key2a" => "value2a"}}) がある場合は、深いコピーを作成する必要があります。上記の質問に対するウェイン・コンラッドの回答によると、それを行う方法は次のとおりです。

def deep_copy(o)
  Marshal.load(Marshal.dump(o))
end
于 2012-09-27T23:26:28.307 に答える
2

dupハッシュのコピーを作成する場合は、次のメソッドを使用する必要があります。

foo = {"name 1" => 0, "name 2" => 0}
bar = foo
foo["name 2"] += 1
foo
=> {"name 2"=>1, "name 1"=>0}
bar
=> {"name 2"=>1, "name 1"=>0}

baz = foo.dup
foo["name 2"] += 1
foo
=> {"name 2"=>2, "name 1"=>0}
baz
=> {"name 2"=>1, "name 1"=>0}
于 2012-09-27T23:31:31.277 に答える