Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.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 在克隆的散列上调用数组#delete_at也会更改原始散列吗?_Ruby_Arrays_Hashmap - Fatal编程技术网

Ruby 在克隆的散列上调用数组#delete_at也会更改原始散列吗?

Ruby 在克隆的散列上调用数组#delete_at也会更改原始散列吗?,ruby,arrays,hashmap,Ruby,Arrays,Hashmap,我遇到了一个有点奇怪的问题,如果我试图在克隆的散列上调用delete\u at,该散列恰好有一个数组作为其键值之一,它也将从原始散列中删除。有没有办法绕过这件事 h1 = {:stuff => [1,2,3]} h2 = h1.clone h2[:stuff].delete_at(0) puts h1 #=> {:stuff=>[2, 3]} puts h2 #=> {:stuff=>[2, 3]} 问题是称为h2[:stuff]的数组与h1[:stuff]相同

我遇到了一个有点奇怪的问题,如果我试图在克隆的散列上调用
delete\u at
,该散列恰好有一个数组作为其键值之一,它也将从原始散列中删除。有没有办法绕过这件事

h1 = {:stuff => [1,2,3]}
h2 = h1.clone
h2[:stuff].delete_at(0)

puts h1 #=> {:stuff=>[2, 3]}
puts h2 #=> {:stuff=>[2, 3]}

问题是称为
h2[:stuff]
的数组与
h1[:stuff]
相同。你需要
dup

h1 = {:stuff => [1,2,3]}
h2 = h1.clone
h2.keys.each{|k| h2[k] = h2[k].dup}
h2[:stuff].delete_at(0)
或者更直接地说

h1 = {:stuff => [1,2,3]}
h2 = {}
h1.each{|k, v| h2[k] = v.dup}
h2[:stuff].delete_at(0)
请注意,不可变对象不能
dup
ed。在这种情况下,您需要执行以下操作:

h1 = {:stuff => [1,2,3]}
h2 = {}
h1.each{|k, v| h2[k] = v.dup rescue v}
h2[:stuff].delete_at(0)

这是因为
clone
制作了一个浅拷贝吗?为了进一步澄清,我在irb中这样做了,两个数组都有相同的
对象id