在数组中§
请参阅主要文档 在上下文中 了解方法克隆
method clone(Array: --> Array)
克隆原始数组
。克隆中元素的修改不会传播到原始元素,反之亦然
my = <a b c>; my = .clone;[1] = 42; .push: 72;say ; # OUTPUT: «[a 42 c]»say ; # OUTPUT: «[a b c 72]»
但是,请注意,两个数组之间共享具体化器,因此即使每个数组在具体化时都是随机生成的,并且每个元素只具体化一次,无论具体化是由克隆还是原始数组完成的,这两个数组都将具有相同的元素。注意:就像从多个线程具体化数组不安全一样,例如,从一个线程具体化克隆,而从另一个线程具体化原始数组也不安全。
my = 1, … ∞; my = .clone;say [^3]; # OUTPUT: «(1 0.0216426755282736 0.567660896142156)»say [^3]; # OUTPUT: «(1 0.0216426755282736 0.567660896142156)»
在日期时间中§
请参阅主要文档 在上下文中 了解方法克隆
method clone(DateTime: :, :, :, :, :, :, :, :)
基于调用者创建一个新的日期时间
对象,但使用给定的参数覆盖调用者的值。
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 ;# OUTPUT: «X::OutOfRange: Day out of range. Is: 29, should be in 1..28»
在匹配中§
请参阅主要文档 在上下文中 了解方法克隆
method clone()
克隆匹配
对象。
在 Mu 中§
请参阅主要文档 在上下文中 了解方法克隆
multi method clone(Mu: *)multi method clone(Mu: *)
此方法将克隆类型对象,或在使用任何参数调用它时终止。
say Num.clone( :yes )# OUTPUT: «(exit code 1) Cannot set attribute values when cloning a type object in block <unit>»
如果使用值对象调用,它将创建调用者的浅层克隆,包括私有属性的浅层克隆。可以通过名称与属性名称匹配的命名参数提供公共属性的替代值。
my = Point2D.new(x => 2, y => 3);say ; # OUTPUT: «Point(2, 3)»say .clone(y => -5); # OUTPUT: «Point(2, -5)»
请注意,.clone
不会额外浅层复制@.
和 %.
sigiled 属性,如果修改,修改仍然可以在原始对象中找到
my = Foo.new;with my = .clone# Hash and Array attribute modifications in clone appear in original as well:say ;# OUTPUT: «Foo.new(foo => 42, bar => ["Z", "Y"], baz => {:X("W"), :Z("Y")}, …»say ;# OUTPUT: «Foo.new(foo => 70, bar => ["Z", "Y"], baz => {:X("W"), :Z("Y")}, …».boo.(); # OUTPUT: «Hi».boo.(); # OUTPUT: «Bye»
要克隆它们,您可以实现自己的.clone
,它克隆适当的属性并将新值传递给Mu.clone
,例如,通过 nextwith
。
my = Bar.new( :42quux );with my = .clone# Hash and Array attribute modifications in clone do not affect original:say ;# OUTPUT: «Bar.new(quux => 42, foo => ["a", "b"], bar => {:a("b"), :c("d")})»say ;# OUTPUT: «Bar.new(quux => 42, foo => ["Z", "Y"], bar => {:X("W"), :Z("Y")})»
需要|%_
来吸收其余的属性,这些属性原本会通过浅层复制进行复制。
在日期中§
请参阅主要文档 在上下文中 了解方法克隆
method clone(Date: :, :, :, :)
基于调用者创建一个新的日期
对象,但使用给定的参数覆盖调用者的值。
say Date.new('2015-11-24').clone(month => 12); # OUTPUT: «2015-12-24»