哈希重复不能在ruby中工作?

时间:2013-09-02 12:59:53

标签: ruby-on-rails ruby

我试图在以下代码中从一个哈希中获取两个单独的哈希值。 s是一个预先初始化了一些值的哈希值。我想将sheets[:bar]乘以100

sheets[:foo] = Hash[s.clone.sort_by { |key,value| 
                                      value[:a].to_f.abs
                                    }]

sheets[:bar] = Hash[s.clone.sort_by { |key,value| 
                                      value[:a].to_f.abs
                                    }.reverse.first(20)]

sheets[:bar].each do |k, v|
  v.each do |k1, v1|
    if k1 == "%" then
      sheets[:bar][k][k1] *= 100.0
    end
  end
end

结果:不仅在sheets[:bar]而且在sheets[:foo]中,我的20个第一个值乘以100。你知道发生了什么吗?

2 个答案:

答案 0 :(得分:2)

这是因为.clones中生成了值的浅表副本。

获取对象的深层副本不是Ruby默认执行的操作,但您必须使用Marshal模块。

cloned_hash = Marshal::load(Marshal.dump(s))

答案 1 :(得分:0)

您可以使用Marshal创建深层副本。

foo = Marshal.load(Marshal.dump(hash))
bar = Marshal.load(Marshal.dump(hash))