2017-04-03 7 views
5

私は配列変数にリストを入れて、別の配列変数にそれを複製する場合は、両者が区別される:Perl 6アレイのクローンはいつクローンではありませんか?

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

出力は、彼らがお互いに影響を与えないことを示しています

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

しかし、配列をスカラー変数に入れた場合、クローンは2つの独立した変数を保持しません。 1を変更すると、他の変更:

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

出力は、オリジナルとクローンがまだリンクされていることを示しているが、不思議なことに、彼らは同じオブジェクトまたはコンテナではありません。

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 

この1つは、どこ作品

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

しかし、元の配列で、クローンをスカラー変数に代入されたとき、それは動作しません:クローンを配列変数に割り当てられている

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

これはRakudo 2017.01です。

+1

これは不具合で、Rakudo '2017.02'で修正されました。 Rakudo 2017.01以前では、 'Array'クラスには独自の' clone'メソッドがないため、 '$ a.clone'を呼び出すと実際には' Mu.clone'が呼び出されます。 – cuonglm

+1

これにはチケットがありますか?私はRTを見て、見つけませんでした。 –

+1

ここはhttps://rt.perl.org/Public/Bug/Display.html?id=129762です – cuonglm

答えて

1

Rakudo 2017.04ではこれはもう問題ありません。

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 
関連する問題