初用Ruby,需要复制一个hash,然后修改一些值。折腾了半天,发现ruby中的clone是浅clone。
如果需要完全的复制,也就是deep clone,需要使用Marshal, 也就是把这个hash序列化 然后在反序列化。
-
def deep_copy(o)
-
Marshal.load(Marshal.dump(o))
-
end
看如下的例子。
1.对res进行了clone操作,得到part
2.更改了part的两个值,所不同的是,第一个part["A"]是第一层的值,而part["B"]["C"]是嵌套了一层的hash
-
res = { "A"=>"a", "B"=>{"C"=>"c"}}
-
part = res.clone
-
part["A"] = "test"
-
part["B"]["C"]="test"
-
p res
-
p part
初衷是希望对part的两个更改,都不要影响到res,但是实际结果很tricky
res的"A"的值并未被修改,而res["B"]["C"]的值却受到了影响
输出如下:
{"A"=>"a", "B"=>{"C"=>"test"}}
{"A"=>"test", "B"=>{"C"=>"test"}}
所以,在clone的时候,执行的是浅clone:
1.对于A来说,其值是个string,就直接被clone了
2.对于B来说,起值是个引用,指向另一个hash,这个引用也被直接复制了。
3.也就是说,对于res和part来说,A的值“a"有2个副本,而“B"指向的hash,始终只是一个,所以对B中的C的修改,影响到了原来的hash.
之后,又对perl进行了试验。
perl本身复制就相当于clone,而对hash的赋值,也是同样的是浅clone.
-
%hash = ( "A"=>"a", "B"=>("C"=>"c"));
-
%duphash = %hash;
-
$duphash{"A"} = "TEST";
-
$duphash{"B"}{"C"}="test";
-
print $hash{"B"}{"C"}."\n";
-
print $hash{"A"}."\n";
输出的结果
test
a
同样是clone出的hash,对于嵌套的hash的赋值,影响到了原来的的值。所以如果需要完全复制,还需要自己实现。
阅读(3316) | 评论(0) | 转发(0) |