元素成员在Perl 6中是如何工作的?

jjm*_*elo 11 set perl6 raku

考虑这个例子

my @fib =  (1,1, * + * … * > 200).rotor(2 => -1); 
say @fib[0] ?  @fib; # prints True
Run Code Online (Sandbox Code Playgroud)

第一个语句通过使用转子函数创建一个2元素子序列.将包含,等等.很明显,序列的第一个元素是序列的一部分.或者是吗?@fib(1,1)(1,2)

my @fib =  (1,1, * + * … * > 200).rotor(2 => -1); 
say @fib[0], @fib[0].^name; # OUTPUT: «(1 1)List?»
Run Code Online (Sandbox Code Playgroud)

所以第一个元素包含一个值为(1 1)的列表.好吧,让我们来看看

my $maybe-element = (1,1); 
say $maybe-element, $maybe-element.^name; # OUTPUT: «(1 1)List?»
say $maybe-element ?  @fib;               # OUTPUT: «False?»
Run Code Online (Sandbox Code Playgroud)

等等,什么?让我们来看看...

my $maybe-element = @fib[0]; 
say $maybe-element ? @fib; # OUTPUT: «True?»
Run Code Online (Sandbox Code Playgroud)

哼.所以它不是容器.但

say (1,1).List === (1,1).List; # OUTPUT: «False?»
Run Code Online (Sandbox Code Playgroud)

say (1,1).List == (1,1).List; # OUTPUT: «True?»
Run Code Online (Sandbox Code Playgroud)

所以我猜?是使用对象标识,而不是平等.既然如此,如果使用此运算符包含独立生成的列表,我们如何检查列表的集合或序列?我们应该使用另一种不同的策

也许一个子问题是为什么相同的文字生成完全不同的对象,但可能有一个很好的,很可能与安全相关的答案.

mor*_*itz 8

所以我猜∈使用的是对象身份,而不是平等.

那是正确的.

既然如此,如果使用此运算符包含独立生成的列表,我们如何检查列表的集合或序列?

您可以使用.grep或者.first您选择的等于运算符(可能是您想要的eqv),或者您可以尝试查找类似列表的值类型.在我的脑海中,我不知道是否内置了Perl 6.

  • @ElizabethMattijsen +1,但请称之为'Tuple`而不是'Parcel`:D. (4认同)
  • 有时我认为我们应该将`Parcel`重新设置为`List`的子类.强制转换为'Parcel`会创建一个`$!reified`的副本,其中所有值都是deconted,并且具有从中生成的值`.WHICH`. (3认同)