2017-04-03 20 views
5

अगर मैं एक सरणी चर में एक सूची में डाल दिया और एक अन्य सरणी चर में यह क्लोन, दो अलग-अलग हैं:एक पर्ल 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) 

हालांकि, अगर मैं एक स्केलर चर में एक ऐरे डालता हूं, तो क्लोन दो अलग नहीं रखता है। एक बदलने के अन्य परिवर्तन:

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 

यह एक है, जहां काम करता है

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

लेकिन जब मूल एक सरणी है और क्लोन एक अदिश चर को सौंपा गया है, यह काम नहीं करता: क्लोन एक सरणी चर को असाइन किया गया

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

यह राकुडो 2017.01 है।

+1

यह एक बग है और राकुडो '2017.02' में तय किया गया था। राकुडो 2017.01 और इससे पहले, 'ऐरे' वर्ग में अपनी 'क्लोन' विधि नहीं है, इसलिए '$ aclone' को कॉल करना वास्तव में' Mu.clone' को कॉल करें। – cuonglm

+1

क्या इसके लिए कोई टिकट है? मैंने आरटी में देखा और एक नहीं मिला। –

+1

यह यहां है https://rt.perl.org/Public/Bug/Display.html?id=129762 – cuonglm

उत्तर

1

राकुडो 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 
संबंधित मुद्दे