Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 哈希复制在ruby中不起作用?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 哈希复制在ruby中不起作用?

Ruby on rails 哈希复制在ruby中不起作用?,ruby-on-rails,ruby,Ruby On Rails,Ruby,在下面的代码中,我试图从一个散列中获取两个单独的散列s是一个预先用某个值初始化的哈希。我想用100乘以sheets[:bar] sheets[:foo] = Hash[s.clone.sort_by { |key,value| value[:a].to_f.abs }] sheets[:bar] = Hash[s.clone.sort_by {

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

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

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

这是因为
.clone
会在
s
中生成你的值的浅拷贝

Ruby默认情况下不会获取对象的深度副本,但您必须使用封送模块

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

您可以使用封送处理创建深度副本

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

发帖会有帮助。我编辑了这个问题,但无论如何,
s
的类型是显而易见的(
sort|u by | key,value |
)它可能是显而易见的,但是代码是不可运行的。就像这个网站中90%的代码一样。另外,我的评论不是给你的,但是我想要的评论被删除了。如果所有问题都包含runnable示例,那么更多(全部?)问题都会得到回答。例如,当我无法复制/粘贴/运行代码并且问题/答案不明显时,有时我会要求澄清。但更多的时候我只是结帐。发布sscce符合个人的最佳利益。:)用
deep\u-dup
解决了这个问题,谢谢。还要注意的是
deep\u-dup
是Rails/ActiveSupport的扩展,不是Ruby的一部分。