我遇到了一个奇怪的问题,如果我尝试调用delete_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
编辑不可变对象。在这种情况下,您需要执行以下操作:
h1 = {:stuff => [1,2,3]}
h2 = {}
h1.each{|k, v| h2[k] = v.dup rescue v}
h2[:stuff].delete_at(0)