If I put the list in an array variable and clone it into another array variable, then they differ:
my @original = 1, 3, 7; my @clone = @original.clone; @original[*-1] = 'Dog'; say "original is finally <@original[]> ({@original.^name})"; say "clone is finally <@clone[]> ({@clone.^name})";
The result shows that they do not affect each other:
original is finally <1 3 Dog> (Array) clone is finally <1 3 7> (Array)
However, if I put Array in a scalar variable, the clone will not keep two separate. Changing one changes the other:
my $original = [ 1, 3, 7 ]; say "original is <$original[]> ({$original.^name}) with {$original.elems} values"; my $clone = $original.clone; say "clone is <$clone[]> ({$clone.^name}) with {$clone.elems} values"; if $original eqv $clone { say "The original and clone have the same values!"; } if $original === $clone { say "The original and clone are the same object!"; } if $original =:= $clone { say "The original and clone are the same container!"; } $original[*-1] = 'Dog'; say "original is finally <$original[]> ({$original.^name}) with {$original.elems} values"; say "clone is finally <$clone[]> ({$clone.^name}) with {$clone.elems} values";
The result shows that the original and the clone are still connected, but curiously, they are not the same object or container:
original is <1 3 7> (Array) with 3 values clone is <1 3 7> (Array) with 3 values The original and clone have the same values! original is finally <1 3 Dog> (Array) with 3 values clone is finally <1 3 Dog> (Array) with 3 values
This works where the clone is assigned to an array variable:
my $original = [ 1, 3, 7 ]; my @clone = $original.clone; $original[*-1] = 'Dog'; say "original is finally <$original[]> ({$original.^name})"; say "clone is finally <@clone[]> ({@clone.^name})";
But when the original is an array and the clone is assigned to a scalar variable, it does not work:
my @original = 1, 3, 7; my $clone = @original.clone; @original[*-1] = 'Dog'; say "original is finally <@original[]> ({@original.^name})"; say "clone is finally <$clone[]> ({$clone.^name})";
This is Rakudo 2017.01.