解构对列表

Hol*_*lli 9 rakudo raku

考虑

.say for (1,2,2).rotor(2=>-1).map( -> ($a, $b) { $a - $b })
Run Code Online (Sandbox Code Playgroud)

它按预期工作。然而,

.say for (1,2,2).pairs.rotor(2=>-1).map( -> ($a, $b) { $a.value - $b.value })
Run Code Online (Sandbox Code Playgroud)

投掷

Too few positionals passed to '<anon>'; expected 2 arguments but got 0 in sub-signature
Run Code Online (Sandbox Code Playgroud)

这是一个错误还是我错过了什么?

这是基于实施 Perl 6.d 的 MoarVM 2019.03 版构建的 Rakudo Star 2019.03.1 版。

Eli*_*sen 7

它将 thePair作为 a Capture,从而将 thePair变成一个命名参数:

$ raku -e '(a => 42, b => 666).map: -> |c { dd c }'
\(:a(42))
\(:b(666))
Run Code Online (Sandbox Code Playgroud)

在您的示例中,它然后不传递任何位置参数,从而导致观察到的执行错误。

jnthn++ 指出了这一点。

  • 强制“Capture”正是解构的工作原理。 (3认同)