我正在尝试在CoffeeScript中复制(专门深层复制)一个对象。这是问题所在:
class Mat
constructor: ->
@m00 = 5
@m01 = 3
mul: (b) ->
x1 = @m00
@m00 = x1 * b.m00
@m01 = x1 * b.m00
x = new Mat
x.mul(x)
alert x.m00 #25
alert x.m01 #125
你可以看到,
如何让副本成为具有值的新对象,以便更改实例的值不会影响它?我试图避免这个......
x1 = @m00
y1 = b.m00
@m00 = x1 * y1
编辑: 另一个例子
@m00 = b.m00 * copy.m00 + b.m01 * copy.m03 + b.m02 * copy.m06
@m01 = b.m00 * copy.m01 + b.m01 * copy.m04 + b.m02 * copy.m07
@m02 = b.m00 * copy.m02 + b.m01 * copy.m05 + b.m02 * copy.m08
@m03 = b.m03 * copy.m00 + b.m04 * copy.m03 + b.m05 * copy.m06
@m04 = b.m03 * copy.m01 + b.m04 * copy.m04 + b.m05 * copy.m07
@m05 = b.m03 * copy.m02 + b.m04 * copy.m05 + b.m05 * copy.m08
@m06 = b.m06 * copy.m00 + b.m07 * copy.m03 + b.m08 * copy.m06
@m07 = b.m06 * copy.m01 + b.m07 * copy.m04 + b.m08 * copy.m07
@m08 = b.m06 * copy.m02 + b.m07 * copy.m05 + b.m08 * copy.m08
答案 0 :(得分:1)
我仍然不确定你要做什么,但让我们来看看最新版本的" mul"作用:
mul: (b) ->
x1 = @m00
@m00 = x1 * b.m00
@m01 = x1 * b.m00
您的代码调用" mul"用" x"作为上下文和参数(" b")。因此,第一行代码
x1 = @m00
设置局部变量" x1"到x.m00
。这与b.m00
相同,请记住。
下一行代码将x.m00
设置为" x1"的值的乘积。时间b.m00
,当然与x.m00
相同。因此,在
@m00 = x1 * b.m00
x.m00
的值(因为" b"和" x"引用同一个对象,b.m00
)是25
下一个声明:
@m01 = x1 * b.m00
将x.m01
(和b.m01
)设置为" x1"的产品和b.m00
的当前值。好吧," x1"仍然是5
,因为它尚未更改。但由于之前的陈述,b.m00
现在是25
。因此,x.m01
的值设置为125
(5 * 25
)。