2017-04-03 20 views
5

Jeśli mogę umieścić listę w zmiennej tablicowej i sklonować go do innej zmiennej tablicowej, dwie są różne:Kiedy klon tablicy Perla 6 nie jest klonem?

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

Wyjście pokazuje, że nie wpływają one na siebie:

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

Jeśli jednak umieściłem tablicę w zmiennej skalarnej, klon nie zachowa dwóch oddzielnych. Zmiana jednego zmienia inne:

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

Wyjście pokazuje, że oryginalny i klon są jeszcze połączone, ale co ciekawe nie są one ten sam przedmiot lub pojemnik:

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 

Ten działa, gdzie klon jest przypisana do zmiennej tablicowej:

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

ale gdy oryginał jest tablicą i klon jest przypisana do zmiennej skalarnej, to nie działa:

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

To jest Rakudo 2017.01.

+1

To jest błąd i został naprawiony w Rakudo '2017.02'. W Rakudo 2017.01 i wcześniej, klasa 'Array' nie ma własnej metody' clone', więc wywołanie '$ a.clone' faktycznie wywołuje' Mu.clone'. – cuonglm

+1

Czy jest bilet na to? Spojrzałem w RT i nie znalazłem. –

+1

To tutaj https://rt.perl.org/Public/Bug/Display.html?id=129762 – cuonglm

Odpowiedz

1

W Rakudo 2017.04 nie stanowi to już problemu. Dostaję oczekiwaną wydajność:

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