我不完全理解文档,所以我尝试使用clone
。看起来,如果可变类的属性存在,那么可以通过旧对象更改新对象的属性(这不是我想要的)。如何使它们(即副本和原始对象)完全分开?
class A {
has @.a;
}
my A $x = A.new;
my A $y = A.new;
$x.a = 1, 2;
$y = $x.clone;
$x.a.push(4);
say $y.a; # [1 2 4]
我不完全理解文档,所以我尝试使用clone
。看起来,如果可变类的属性存在,那么可以通过旧对象更改新对象的属性(这不是我想要的)。如何使它们(即副本和原始对象)完全分开?
class A {
has @.a;
}
my A $x = A.new;
my A $y = A.new;
$x.a = 1, 2;
$y = $x.clone;
$x.a.push(4);
say $y.a; # [1 2 4]
class A {
has @.a;
method clone() {
callwith(:@!a, |%_)
}
}
[1 2]
,正如所需。它是如何工作的呢?clone
方法的任何微调传递给下一个对象。
- :@!a
是 a => @!a
的简写。
- callwith
调用了继承的 clone
(在这种情况下是从 Mu
继承的)。
- 对目标对象上的 @!a
使用赋值而不是绑定语义(就像在对象构造期间一样),从而导致数组的副本。callsame(x => $!x.clone)
。
class A
也有@.b
,那我也应该加上:@!b
吗?所以,重写clone()
时,我应该明确处理所有可变属性吗? - Eugene Barskycallsame(:@!a, :%!b, ..., |%_)
一样列出它们。 - Jonathan Worthington