我如何使用Set或Setty存储唯一的数组?

S. *_*ano 2 perl6

我有兴趣使用Set如下持有数组:

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

my $set Set.new(@v1, @v2);
Run Code Online (Sandbox Code Playgroud)

Set容易认识到两个数组是相同的,就像~~运算符所观察到的那样,但是Set使用===运算符来比较大多数对象.

# desired outcome: set([1 2 3])
# actual outcome: set([1 2 3], [1 2 3])
Run Code Online (Sandbox Code Playgroud)

可以在将数组添加到数组之前对其进行序列化Set,使用精彩的Set魔法,然后反序列化.这看起来很尴尬.

可以做一个Setty使用类~~的比较.这似乎是一个很好的学习,但也许是错误的.

有没有更惯用的方法呢?

Eli*_*sen 5

这两个数组不相同,因为它们不是值类型:即,它们可以在添加到集合后更改:

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])
Run Code Online (Sandbox Code Playgroud)

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

目前,身份是使用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])
Run Code Online (Sandbox Code Playgroud)

它是由你来招惹@a@b在之后Set被创建,因为这样你就违反了合同,你说承销but frozen.

希望这可以帮助!