这个程序
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;
显然作品,虽然我没有看到真正的区别。任何其他的想法?
它看起来像我的错误。
这看起来很密切的关系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 关闭。
神秘,为什么有一个新的bug。我怀疑是有人需要清理厨房水槽,即拿起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;
或许是因为那是不可修改的版本。和/或因为它不使用->
语法(这是按我的高尔夫回归或新的bug以上的部分)。
或许只是运气。我想大多数的Rakudo水槽处理代码的是拉里的工作,从很久以前,当他试图让事情大多是工作的权利。