1

我正在尝试从以下代码中的一个哈希中获取两个单独的哈希。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。你知道发生了什么事吗?

4

2 回答 2

2

这是因为.clones.

默认情况下,获取对象的深层副本不是 Ruby 所做的,但您必须使用 Marshal 模块。

cloned_hash = Marshal::load(Marshal.dump(s))
于 2013-09-02T13:01:40.360 回答
0

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

foo = Marshal.load(Marshal.dump(hash))
bar = Marshal.load(Marshal.dump(hash))
于 2013-09-02T13:11:45.627 回答