gpt4 book ai didi

raku - 我将如何使用 Set 或 Setty 来存储唯一数组?

转载 作者:行者123 更新时间:2023-12-05 00:38:57 24 4
gpt4 key购买 nike

我有兴趣使用 Set 来保存数组,如下所示:

my @v1 = 1, 2, 3;
my @v2 = 1, 2, 3;

my $set Set.new(@v1, @v2);

如果 Set 能够识别出这两个数组是相同的,就像使用 ~~ 运算符观察到的那样,但是 Set 使用 === 运算符来比较大多数对象。

# desired outcome: set([1 2 3])
# actual outcome: set([1 2 3], [1 2 3])

可以在将数组添加到Set 之前序列化数组,使用美妙的Set 魔法,然后反序列化。这似乎很尴尬。

可以制作一个使用~~ 作为比较器的Setty 类。这似乎是一个很好的学习,但也许是错误的。

有没有更惯用的方法来做到这一点?

最佳答案

这两个数组不被认为是相同的,因为它们不是值类型:即,它们可以在添加到 Set 后发生变化:

my @a = 1,2,3;
my @b = 1,2,3;
my $s = Set.new(@a,@b);
dd $s; # Set $s = set([1, 2, 3],[1, 2, 3])
@a.push(4);
dd $s; # Set $s = set([1, 2, 3, 4],[1, 2, 3])

Perl 6 中的对象标识由 .WHICH 方法确定。对于值类型,这将返回值的唯一表示。对于像 Array 这样的引用类型,它会根据类型及其对象 ID 返回唯一标识对象的内容。

目前,identity 是使用 ObjAt 类实现的,但功能仍有一些变化。但是,只要 .WHICH 方法返回的内容可以唯一地描述认为标识您的对象的内容,您就应该能够创建自己的 .WHICH 实现。例如:

role frozen {
method WHICH() {
ObjAt.new(self.join("\0")) # something not occurring in values
}
}
my @a = 1,2,3;
my @b = 1,2,3;
my $s = Set.new(@a but frozen,@b but frozen);
dd $s; # Set $s = set([1, 2, 3])

在创建 Set 之后,不要乱用 @a@b 取决于你,因为那样的话你会通过说but frozen 来违反您所签署的契约(Contract)。

希望这对您有所帮助!

关于raku - 我将如何使用 Set 或 Setty 来存储唯一数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44623955/

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