Project1

标题: 数组代入问题 [打印本页]

作者: SeRiKa    时间: 2009-7-1 22:14
提示: 作者被禁止或删除 内容自动屏蔽
作者: 紫苏    时间: 2009-7-1 22:28
因为 $b[0] = $a 和 $b[1] = $a 这两句都是引用的拷贝,它们让变量指向 $a 在内存中的地址,所以当你调用 $e.e 修改了 $a 之后,会同时反映给 $b[0] 和 $b[1]~
要避免这个现象,可以利用对象的克隆:
http://szsu.spaces.live.com/blog/cns!D57D0E50BE1820CF!170.entry
(原帖数据丢失了,这是备份)
作者: SeRiKa    时间: 2009-7-1 22:34
提示: 作者被禁止或删除 内容自动屏蔽
作者: 紫苏    时间: 2009-7-1 22:52
前者是修改了 $a 指向的对象本身(把 $a 的第一个和第二个元素都改变了),$a 本身还是指向这个对象的,而 $b[0] 和 $b[1] 又指向 $a,所以这两个又都指向该对象,自始至终这三者指向的内存地址值没有改变过。

后者则是让 $a 指向的对象改变了——第一次调用 $e.e 时指向的是 [1, 1] 这个对象,接着又让 $b[0] 指向了 [1, 1];然后第二次调用 $e.e 后,$a 指向了 [2, 2],这就是另外一个对象了,之后 $b[1] 和指向的就是 [2, 2]
作者: SeRiKa    时间: 2009-7-1 23:15
提示: 作者被禁止或删除 内容自动屏蔽
作者: 紫苏    时间: 2009-7-1 23:51
  1. $e = E.new

  2. $z = 1
  3. $e.e
  4. $b[0] = $a.clone

  5. $z = 2
  6. $e.e
  7. $b[1] = $a.clone

  8. p $b[0]     # <= [[1,1],[1,1]]
  9. p $b[1]     # <= [[2,2],[2,2]]
复制代码
你要的是这个效果吧




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1