【发布时间】:2016-03-17 06:50:19
【问题描述】:
我正在尝试复制一个哈希,然后修改哈希的副本。但是当我将副本与原始副本进行比较时,甚至原始哈希值也被修改了。 我试过使用this:
def deep_copy(o)
Marshal.load(Marshal.dump(o))
end
h1 = {:a => 'foo'}
h2 = deep_copy(h1)
h1[:a] << 'bar'
p h2
我也试过this:
def dumpable_hash(h)
return h unless h.default_proc
copy = h.clone
copy.default = nil # clear the default_proc
copy
end
哈希对象(我想复制并保持其原始未修改):
@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=>[]}}
尝试将原件复制到另一个对象中,也使用给定的答案。
用于更新其克隆的方法,
#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
当循环结束时,original 和 copy 都会更新。
请帮忙,我已经尝试了一个小时。
【问题讨论】:
-
您使用的是哪个版本的 ruby(或 irb?)?我已经使用 ruby 版本 1.9.3、2.0 和 2.3 尝试了您的 deep_copy() 示例,但没有发现任何问题。也许您还可以更明确地说明您遇到的问题。
-
我仍然无法修复它,我猜是因为嵌套哈希。
-
@peak,请查看更新后的问题。