When is a Perl 6 clone array not a clone?

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.

+5
source share
1 answer

In Rakudo 2017.04, this is no longer a problem. I get the expected result:

 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 7> (Array) with 3 values 
+1
source

Source: https://habr.com/ru/post/1266243/


All Articles