Chinaunix首页 | 论坛 | 博客
  • 博客访问: 978727
  • 博文数量: 150
  • 博客积分: 3017
  • 博客等级: 少校
  • 技术积分: 3829
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 14:40
个人简介

Now in Baidu WISE team

文章分类

全部博文(150)

文章存档

2014年(8)

2013年(31)

2012年(111)

分类: Python/Ruby

2014-07-17 15:31:57

初用Ruby,需要复制一个hash,然后修改一些值。折腾了半天,发现ruby中的clone是浅clone。
如果需要完全的复制,也就是deep clone,需要使用Marshal, 也就是把这个hash序列化 然后在反序列化。

  1. def deep_copy(o)
  2.   Marshal.load(Marshal.dump(o))
  3. end



看如下的例子。
1.对res进行了clone操作,得到part
2.更改了part的两个值,所不同的是,第一个part["A"]是第一层的值,而part["B"]["C"]是嵌套了一层的hash

点击(此处)折叠或打开

  1. res = { "A"=>"a", "B"=>{"C"=>"c"}}
  2. part = res.clone
  3. part["A"] = "test"
  4. part["B"]["C"]="test"
  5. p res
  6. 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.

  1. %hash = ( "A"=>"a", "B"=>("C"=>"c"));
  2. %duphash = %hash;
  3. $duphash{"A"} = "TEST";
  4. $duphash{"B"}{"C"}="test";
  5. print $hash{"B"}{"C"}."\n";
  6. print $hash{"A"}."\n";
输出的结果
test

a
同样是clone出的hash,对于嵌套的hash的赋值,影响到了原来的的值。所以如果需要完全复制,还需要自己实现。









阅读(3201) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~