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.
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
Gibt es ein Ticket für das? Ich schaute in RT und fand keinen. –
Es ist hier https://rt.perl.org/Public/Bug/Display.html?id=129762 – cuonglm