gpt4 book ai didi

object - 在 Raku 中克隆对象

转载 作者:行者123 更新时间:2023-12-03 13:46:54 25 4
gpt4 key购买 nike

在 raku 中克隆对象的最佳方法是什么?我知道克隆方法存在,但它似乎不适用于嵌套对象。
例如,在此脚本中:

#!/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;
输出是:
[1 2 3 4 5 6]
[1 2 3 4 5 6]
但我期待它是:
[1 2 3]
[1 2 3 4 5 6]

最佳答案

除了clone,我不会使用任何东西。克隆对象。 clone是由 Mu 定义的 proto 方法,但在这种情况下由其子类型来实现其行为,因为克隆对象确实会克隆数组属性,但不是以您想要的方式。因此,您可以编写自己的 clone multis 的行为与您期望的一样:

# 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
}
::?CLASS这是一个符号,当在类中使用时,它是类本身的别名, :D将类型限制为仅实例。

关于object - 在 Raku 中克隆对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62905400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com