该程序
my @bitfields;
for ^3 -> $i {
@bitfields[$i] = Bool.pick xx 3;
}
my @total = 0 xx 3;
for @bitfields -> @row {
@total Z+= @row;
}
say @total;
说[0 0 0]
。如果我们在循环中添加一些东西,那么:
my @bitfields;
for ^3 -> $i {
@bitfields[$i] = Bool.pick xx 3;
}
my @total = 0 xx 3;
for @bitfields -> @row {
@total Z+= @row;
say "foo";
}
say @total;
它将正常工作。显然,该块的最后一个元素被扔到接收器上下文中,在这种情况下,这意味着它被简单地忽略了。这个trap与此有关。但是,上面的代码看起来很好。还有这个
{@total Z+= @^þ} for @bitfields;
显然有效,尽管我看不出真正的区别。还有其他想法吗?
答案 0 :(得分:5)
对我来说似乎是个虫子。
这看起来与Which context confuses this Perl 6 zip operator?密切相关,后者成为Rakudo回购问题Failure to sink for
when Z+=
used as last statement,已通过烘烤测试Test sunk for sinks last statement sub calls 结束。
之谜是为什么有一个新的错误。我的怀疑是有人需要清洁厨房的水槽,例如,在Zoffix因Flaws in implied sinkage / &unwanted
helper问题停下来的地方捡拾东西。
到目前为止,这是我迄今为止最好的击球记录,用于缩小新问题或回归范围:
my $foo = 'a';
ok: for 1 { $foo X= 'b' }
notok: for 1 -> $_ { $foo X= 'c' }
say $foo; # b
halfok: 'd' ~ do for 1 -> $_ { $foo X= 'e' } # Useless use of "~"
say $foo; # e
ok:
行之所以有效,是因为它省略了->
参数。
notok:
这行是我对您的问题的看法。
halfok:
行的错误消息是因为丢弃了它的结果。但是do
迫使编译器按原样应该在块中对$foo X= 'e'
表达式进行求值,而在notok:
行中却失败了。
{@total Z+= @^þ} for @bitfields;
也许是因为这是非修饰符版本。和/或因为它不使用->
语法(这是上面我所说的高尔夫回归或新错误的一部分)。
或者只是运气。我认为Rakudo中的大多数接收器处理代码都是Larry从很早以前开始的工作,当时他试图使大多数事情正常运行。