在数组中§

请参阅主要文档 在上下文中 了解方法克隆

method clone(Array:D: --> Array:D)

克隆原始数组。克隆中元素的修改不会传播到原始元素,反之亦然

my @a = <a b c>my @b = @a.clone;
@b[1= 42@a.push: 72;
say @b# OUTPUT: «[a 42 c]␤» 
say @a# OUTPUT: «[a b c 72]␤»

但是,请注意,两个数组之间共享具体化器,因此即使每个数组在具体化时都是随机生成的,并且每个元素只具体化一次,无论具体化是由克隆还是原始数组完成的,这两个数组都将具有相同的元素。注意:就像从多个线程具体化数组不安全一样,例如,从一个线程具体化克隆,而从另一个线程具体化原始数组也不安全。

my @a = 1{rand} … ∞; my @b = @a.clone;
say @b[^3]; # OUTPUT: «(1 0.0216426755282736 0.567660896142156)␤» 
say @a[^3]; # OUTPUT: «(1 0.0216426755282736 0.567660896142156)␤»

在日期时间中§

请参阅主要文档 在上下文中 了解方法克隆

method clone(DateTime:D: :$year:$month:$day:$hour:$minute:$second:$timezone:&formatter)

基于调用者创建一个新的日期时间对象,但使用给定的参数覆盖调用者的值。

say DateTime.new('2015-12-24T12:23:00Z').clone(hour => 0);
# OUTPUT: «2015-12-24T00:23:00Z␤»

请注意,在某些情况下,这会导致无效的日期

say DateTime.new("2012-02-29T12:34:56Z").clone(year => 2015);
CATCH { default { put .^name''.Str } };
# OUTPUT: «X::OutOfRange: Day out of range. Is: 29, should be in 1..28␤»

在匹配中§

请参阅主要文档 在上下文中 了解方法克隆

method clone()

克隆匹配对象。

在 Mu 中§

请参阅主要文档 在上下文中 了解方法克隆

multi method clone(Mu:U: *%twiddles)
multi method clone(Mu:D: *%twiddles)

此方法将克隆类型对象,或在使用任何参数调用它时终止。

say Num.clone:yes )
# OUTPUT: «(exit code 1) Cannot set attribute values when cloning a type object␤  in block <unit>␤␤» 

如果使用值对象调用,它将创建调用者的浅层克隆,包括私有属性的浅层克隆。可以通过名称与属性名称匹配的命名参数提供公共属性的替代值。

class Point2D {
    has ($.x$.y);
    multi method gist(Point2D:D:{
        "Point($.x$.y)";
    }
}
 
my $p = Point2D.new(x => 2=> 3);
 
say $p;                     # OUTPUT: «Point(2, 3)␤» 
say $p.clone(=> -5);      # OUTPUT: «Point(2, -5)␤» 

请注意,.clone 不会额外浅层复制@.%. sigiled 属性,如果修改,修改仍然可以在原始对象中找到

class Foo {
    has $.foo is rw = 42;
    has &.boo is rw = { say "Hi" };
    has @.bar       = <a b>;
    has %.baz       = <a b c d>;
}
 
my $o1 = Foo.new;
with my $o2 = $o1.clone {
    .foo = 70;
    .bar = <Z Y>;
    .baz = <Z Y X W>;
    .boo = { say "Bye" };
}
 
# Hash and Array attribute modifications in clone appear in original as well: 
say $o1;
# OUTPUT: «Foo.new(foo => 42, bar => ["Z", "Y"], baz => {:X("W"), :Z("Y")}, …␤» 
say $o2;
# OUTPUT: «Foo.new(foo => 70, bar => ["Z", "Y"], baz => {:X("W"), :Z("Y")}, …␤» 
$o1.boo.(); # OUTPUT: «Hi␤» 
$o2.boo.(); # OUTPUT: «Bye␤» 

要克隆它们,您可以实现自己的.clone,它克隆适当的属性并将新值传递给Mu.clone,例如,通过 nextwith

class Bar {
    has $.quux;
    has @.foo = <a b>;
    has %.bar = <a b c d>;
    method clone { nextwith :foo(@!foo.clone), :bar(%!bar.clone), |%_  }
}
 
my $o1 = Bar.new:42quux );
with my $o2 = $o1.clone {
    .foo = <Z Y>;
    .bar = <Z Y X W>;
}
 
# Hash and Array attribute modifications in clone do not affect original: 
say $o1;
# OUTPUT: «Bar.new(quux => 42, foo => ["a", "b"], bar => {:a("b"), :c("d")})␤» 
say $o2;
# OUTPUT: «Bar.new(quux => 42, foo => ["Z", "Y"], bar => {:X("W"), :Z("Y")})␤» 

需要|%_来吸收其余的属性,这些属性原本会通过浅层复制进行复制。

在日期中§

请参阅主要文档 在上下文中 了解方法克隆

method clone(Date:D: :$year:$month:$day:&formatter)

基于调用者创建一个新的日期对象,但使用给定的参数覆盖调用者的值。

say Date.new('2015-11-24').clone(month => 12);    # OUTPUT: «2015-12-24␤»