在水槽上下文抛出的块的最后一个元素

问题描述 投票:6回答:1

这个程序

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;

显然作品,虽然我没有看到真正的区别。任何其他的想法?

perl6
1个回答
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 关闭。

神秘,为什么有一个新的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水槽处理代码的是拉里的工作,从很久以前,当他试图让事情大多是工作的权利。

© www.soinside.com 2019 - 2024. All rights reserved.