Project1

标题: a = b 和 a = b.dup 的区别是什么? [打印本页]

作者: gaofei677    时间: 2013-8-11 14:17
标题: a = b 和 a = b.dup 的区别是什么?
在具体使用a = b 和 a = b.dup这两个方法的过程中发现,大部分情况下他们的作用一样,但是有时候,使用 a = b会出现一些意外
比如:
  1. a = 0
  2. a = b
  3. if a == b
  4.   .....
  5.   a = 1
  6. end

  7. msgbox(a) => 1
  8. msgbox(b) => 1
复制代码
出现这种使用a = b赋值后,经过一系列计算,a= b 还在工作(这个简单的例子可能没有这种情况)
如果使用a = b.dup,就不会出现上述情况
所以我想问a = b 和 a = b.dup 到底有什么区别,他们分别的工作原理是什么?
作者: satgo1546    时间: 2013-8-11 14:36
数值、逻辑值等简单对象不允许使用dup,其他对象必须使用dup否则你会无法理解ruby为什么不执行a = b。
事实上a = b后,a和b是两个一样的东西——它们什么都一样,甚至内存地址都一样(大概吧)…………
而a = b.dup或a = b.clone会得出两个内容一样而实质不同的东西。
作者: 怪蜀黍    时间: 2013-8-11 14:53
你的代码写错了,第一行应该是
  1. b = 0
复制代码
最后结果也写错了
  1. msgbox(a) => 1
  2. msgbox(b) => 0
复制代码
数值的话是独立的,b不会随着a改变,但是产生实例之后,要想得到两个相同的实例就要使用dup或者clone。
比如
  1. a = Game_Actor.new(1) # 假定1号角色的攻击力是10
  2. b = a.dup
  3. a.atk = 100
  4. c = a
  5. msgbox(a.atk) => 100
  6. msgbox(b.atk) => 10
  7. msgbox(c.atk) => 100
复制代码
注意,数组的话也要使用dup。不要误认为
  1. a = []
  2. b = a
复制代码
是数值操作,因为
  1. a = []
复制代码
相当于
  1. a = Array.new
复制代码
也是生成了实例。




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