clone – 如何在Perl 6中创建对象的单独副本?
发布时间:2020-12-15 21:49:30 所属栏目:大数据 来源:网络整理
导读:我不完全理解 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)
我不完全理解
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]大概是所希望的.它是如何工作的? > |%_只传递指定此克隆方法的调用者的任何调整 此快捷方式也适用于哈希属性.对于包含其他对象的属性,它看起来像callsame(x => $!x.clone). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |