2017-04-03 7 views
5

Wenn ich eine Liste in einer Array-Variablen gesetzt und in ein anderes Array-Variable klonen, sind die zwei verschiedene:Wenn ein Array Perl 6 Klon kein Klon?

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})"; 

Die Ausgabe zeigt, dass sie beeinflussen sich nicht gegenseitig:

original is finally <1 3 Dog> (Array) 
clone is finally <1 3 7> (Array) 

Allerdings, wenn ich ein Array in eine skalare Variable setzen, wird der Klon nicht die zwei separate halten. ein Ändern ändert die andere:

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"; 

Die Ausgabe zeigt, dass der ursprüngliche und der Klon noch verbunden sind, aber sie sind neugierig nicht das gleiche Objekt oder 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 

Dieses funktioniert, wo der Klon wird zu einer Array-variablen zugewiesen:

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})"; 

Aber wenn das Original ein Array und der Klon ist auf einem skalaren variablen zugewiesen, funktioniert es nicht:

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})"; 

Dies ist Rakudo 2017.01.

+1

Dies ist ein Fehler und wurde in Rakudo '2017.02' behoben. In Rakudo 2017.01 und vorher hat die Klasse 'Array' keine eigene' clone' Methode, also ruft '$ a.clone' tatsächlich' Mu.clone' auf. – cuonglm

+1

Gibt es ein Ticket für das? Ich schaute in RT und fand keinen. –

+1

Es ist hier https://rt.perl.org/Public/Bug/Display.html?id=129762 – cuonglm

Antwort

1

In Rakudo 2017,04, ist dies kein Problem mehr. Ich bekomme die erwartete Ausgabe:

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