我有兴趣使用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使用类~~的比较.这似乎是一个很好的学习,但也许是错误的.
有没有更惯用的方法呢?
这两个数组不相同,因为它们不是值类型:即,它们可以在添加到集合后更改:
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.
希望这可以帮助!