在 raku 中克隆对象的最佳方法是什么?我知道 clone 方法存在,但它似乎不适用于嵌套对象。
例如,在这个脚本中:
#!/usr/bin/env perl6
class Group {
has Int @!group = Array[Int].new;
method add-item(Int $int) {
@!group.push($int);
}
method print {
say @!group;
}
}
class GroupOfGroups {
has Group @!multi-group = Array[Group].new;
method add-group(Group $group) {
@!multi-group.push($group);
}
method print {
for ^@!multi-group.elems -> $i {
@!multi-group[$i].print;
}
}
}
my $group = Group.new;
$group.add-item(1);
$group.add-item(2);
$group.add-item(3);
my $group-of-groups = GroupOfGroups.new;
$group-of-groups.add-group($group.clone);
$group.add-item(4);
$group.add-item(5);
$group.add-item(6);
$group-of-groups.add-group($group.clone);
$group-of-groups.print;
Run Code Online (Sandbox Code Playgroud)
输出是:
[1 2 3 4 5 6]
[1 2 3 4 5 6]
Run Code Online (Sandbox Code Playgroud)
但我期待它是:
[1 2 3]
[1 2 3 4 5 6]
Run Code Online (Sandbox Code Playgroud)
除了clone克隆对象,我不会使用任何其他东西。clone是由 定义的原型方法Mu,但在这种情况下由其子类型来实现其行为,因为克隆对象确实克隆了数组属性,但不是以您想要的方式。因此,您可以编写自己的clonemultis,其行为符合您的预期:
# Group
multi method clone(::?CLASS:D: --> ::?CLASS:D) {
my ::?CLASS:D $clone .= new;
$clone.add-item: .clone for @!group;
$clone
}
# GroupOfGroups
multi method clone(::?CLASS:D: --> ::?CLASS:D) {
my ::?CLASS:D $clone .= new;
$clone.add-group: .clone for @!multi-group;
$clone
}
Run Code Online (Sandbox Code Playgroud)
::?CLASS这是一个符号,当在类中使用时,它是类本身的别名,:D将类型限制为仅实例。