在ruby中修改副本时修改实际哈希

在ruby中修改副本时修改实际哈希,ruby,hash,Ruby,Hash,我正在尝试复制散列,然后稍后修改散列的副本。但是,当我将副本与原始副本进行比较时,甚至原始哈希值也会被修改。 我试过使用: 散列对象(我希望复制并保持其原始内容不变): 尝试将原始内容复制到另一个对象中,同时使用给定的答案 用于更新其克隆的方法 #outer loop (1..5).each do |i| #assigning original to another object in every loop copy = @original.clone (-6..0)

我正在尝试复制散列,然后稍后修改散列的副本。但是,当我将副本与原始副本进行比较时,甚至原始哈希值也会被修改。 我试过使用:

散列对象(我希望复制并保持其原始内容不变):

尝试将原始内容复制到另一个对象中,同时使用给定的答案

用于更新其克隆的方法

 #outer loop
 (1..5).each do |i|   
 #assigning original to another object in every loop
 copy = @original.clone
       (-6..0).each do |row|                    
            if copy[row.abs][0].include? k
                copy[row.abs][0] -= [k]
                copy[row.abs][1] += [k]
                puts "row #{row.abs}, col #{k}"
                break
            end
        end
    end
循环结束后,
原始
副本
都会更新。
请帮忙,我已经试了一个小时了。

我想你需要在这里做deep\u-dup来完全区分散列内容

h1 = {a: "foo"}
h2 = h1.deep_dup
h2[:a] << "bar"
puts h2   #returns {:a => "foobar"}
puts h1   # returns {:a => "foo"}
h1={a:“foo”}
h2=h1.0深_重复
h2[:a]“foobar”}
放置h1#返回{:a=>“foo”}

您正在修改原始哈希(附加到h1哈希)。修改深度复制的一个,你可以看到原来的保持不变

def deep_copy(o)
   Marshal.load(Marshal.dump(o))
end
h1 = {:a => 'foo'}
h2 = deep_copy(h1)
h2[:a] << 'bar'
p h2 #prints the cloned one
p h1 #prints the original one
def deep_拷贝(o)
封送装载(封送卸载(o))
结束
h1={:a=>'foo'}
h2=深度拷贝(h1)

h2[:a]如果要将一个散列复制到另一个散列,可以这样做。然后,您可以操纵复制的哈希,甚至可以在循环中进行操作。然后为您的任务操作复制的哈希值。在这里,它复制散列的键值对

@original = {0=>{0=>[0, 4, 5, 6], 2=>[3, 7], 1=>[1, 2]}, 1=>{0=>[0, 4, 5, 6], 2=>[1], 1=>[2, 3, 7]}, 2=>{0=>[0, 4, 6], 1=>[1, 2, 5], 2=>[3, 7]}, 3=>{0=>[0, 4], 2=>[1, 2, 3, 6, 7], 1=>[5]}, 4=>{0=>[4], 2=>[1, 5], 1=>[2, 3, 6, 7, 0]}, 5=>{1=>[0, 1, 2, 5], 2=>[3, 6, 7], 0=>[4]}, 6=>{1=>[0, 1, 2, 5, 4], 2=>[3, 6, 7], 0=>[]}}
copy = Hash.new
@original.each do |k, v|
   copy[k] = v.dup    
end
p copy #prints the copied hash
使用

如果有嵌套哈希,可以使用ActiveSupport


您使用的是哪个版本的ruby(或irb?)?我用ruby版本1.9.3、2.0和2.3尝试了您的deep_copy()示例,没有发现任何问题。也许您还可以更明确地说明您看到的问题。我仍然无法修复它,我想这是因为嵌套哈希。@peak,请检查更新的问题。如果我使用deep_dup,它会显示
未定义的方法'deep_dup'for#(nomethoderor)`
。我试图在联机编码环境中解决一个问题,但无法加载任何外部库。deep_dup是活动的仅支持我收到此错误,
`dump':无法使用默认过程转储哈希(TypeError)`
您能澄清一下吗,你是在哪种在线编码环境下获得的?现在我无法在我的本地环境中实现这一点,如果你可以尝试我在问题中给出的上述示例,因为我无法实现这一点。可能我遗漏了什么?您在本地环境中使用的ruby版本是什么?它是ruby 1.9.3p484(2013-11-22修订版43786)[i686 linux]
非常感谢。它通过使用循环复制散列来工作。
h1 = {a: "foo"}
h2 = h1.deep_dup
h2[:a] << "bar"
puts h2   #returns {:a => "foobar"}
puts h1   # returns {:a => "foo"}
def deep_copy(o)
   Marshal.load(Marshal.dump(o))
end
h1 = {:a => 'foo'}
h2 = deep_copy(h1)
h2[:a] << 'bar'
p h2 #prints the cloned one
p h1 #prints the original one
@original = {0=>{0=>[0, 4, 5, 6], 2=>[3, 7], 1=>[1, 2]}, 1=>{0=>[0, 4, 5, 6], 2=>[1], 1=>[2, 3, 7]}, 2=>{0=>[0, 4, 6], 1=>[1, 2, 5], 2=>[3, 7]}, 3=>{0=>[0, 4], 2=>[1, 2, 3, 6, 7], 1=>[5]}, 4=>{0=>[4], 2=>[1, 5], 1=>[2, 3, 6, 7, 0]}, 5=>{1=>[0, 1, 2, 5], 2=>[3, 6, 7], 0=>[4]}, 6=>{1=>[0, 1, 2, 5, 4], 2=>[3, 6, 7], 0=>[]}}
copy = Hash.new
@original.each do |k, v|
   copy[k] = v.dup    
end
p copy #prints the copied hash
h1 = {a:1, b:2}
h2 = h1.dup
h2[:c] = 3
puts h1
{:a=>1, :b=>2} 
puts h2
{:a=>1, :b=>2, :c=>3} 
def deep_dup
  each_with_object(dup) do |(key, value), hash|
    hash[key.deep_dup] = value.deep_dup
  end
end