【问题标题】:When is a Perl 6 array clone not a clone?Perl 6 数组克隆何时不是克隆?
【发布时间】:2017-06-17 11:56:35
【问题描述】:

如果我将一个列表放入一个数组变量中并将其克隆到另一个数组变量中,则两者是不同的:

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)

但是,如果我将 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})";

但是当原始是一个数组并且克隆被分配给一个标量变量时,它就不起作用了:

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。

【问题讨论】:

  • 这是一个错误,已在 Rakudo 2017.02 中修复。在 Rakudo 2017.01 及之前,Array 类没有自己的clone 方法,所以调用$a.clone 实际上调用Mu.clone
  • 这个有票吗?我在 RT 中查找并没有找到。

标签: clone raku


【解决方案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

【讨论】:

    猜你喜欢
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多