clone – 如何在Perl 6中创建对象的单独副本?

我不完全理解 the docs,所以我尝试了克隆,似乎有一个可变类的属性,它可以在旧对象中使用旧对象进行更改(这就是我不想要的) .如何使它们(即副本和原件)完全分开?
class A {
  has @.a;
}

my A $x = A.new;
my A $y = A.new;

$x.a = 1,2;

$y = $x.clone;

$x.a.push(4);
say $y.a; # [1 2 4]

解决方法

正如文档所述,从Mu继承的认克隆很浅.这意味着它只会复制对象本身,而不会复制对象引用的任何内容.可以覆盖克隆以获得您的首选语义,这可能是最好的事情.

在这样做时要知道的一件有用的事情是,clone接受命名参数并使用它们来分配克隆对象的属性.这值得了解,因为:

>在覆盖克隆时应确保处理此问题,以避免使用此功能的被覆盖克隆方法用户感到意外
>当重写克隆以简洁地选择克隆特定数组或散列属性时,可以使用此方法

因此对于问题中的案例,写作:

class A {
    has @.a;
    method clone() {
        callwith(:@!a,|%_)
    }
}

将导致输出[1 2]大概是所希望的.它是如何工作的?

> |%_只传递指定此克隆方法调用者的任何调整
>:@!a是a =>的缩写@!一个
> callwith调用继承的克隆(在这种情况下来自Mu)
>赋值,而不是绑定,语义用于目标对象中的@!a(就像在对象构造期间一样),从而生成数组的副本

此快捷方式也适用于哈希属性.对于包含其他对象的属性,它看起来像callsame(x => $!x.clone).

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...