如何将循环参数解构为固定大小的数组?

lis*_*tor 4 arrays for-loop raku destructure

我试图将 for 循环中的参数放入 FIXED 大小的数组中。这就是我一直在做的事情(我想使用一个包含 3 个元素的数组 @m):

for (1..19).rotor(3, :partial) -> @m { say @m; } # works, but I cannot specify size of @m
Run Code Online (Sandbox Code Playgroud)

但是,以下所有内容都给了我错误:

for (1..19).rotor(3, :partial) -> @m[0,1,2] { say @m; }
===SORRY!=== Error while compiling:
Variable '@m' is not declared
------> ).rotor(3, :partial) -> @m[0,1,2] { say ?@m; }

for (1..19).rotor(3 => -2) -> @m[0..2] { say @m; }
===SORRY!=== Error while compiling:
Variable '@m' is not declared
------> 1..19).rotor(3 => -2) -> @m[0..2] { say ?@m; }

for (1..19).rotor(3 => -2) -> @m[3] { say $_; say @m; }
===SORRY!=== Error while compiling:
Variable '@m' is not declared
------> ).rotor(3 => -2) -> @m[3] { say $_; say ?@m; }
Run Code Online (Sandbox Code Playgroud)

那么,我应该如何指定数组@m 必须只有 3 个元素?

Jon*_*ton 5

问题的标题提到了解构,但那是关于将某些东西拆开。例如,我们可以使用它提取三个元素:

for (1..19).rotor(3, :partial) -> [$a, $b, $c] {
}
Run Code Online (Sandbox Code Playgroud)

然而,这实际上似乎并不是一个解构问题,因为请求不是将传递的聚合分解成它的部分,而是将它转换为不同类型的聚合。

进一步看这个问题:

我试图将 for 循环中的参数放入 FIXED 大小的数组中。

问题是,rotor根本不产生 (mutable) Arrays。相反,在编写时:

for (1..19).rotor(3, :partial) -> @m {
}
Run Code Online (Sandbox Code Playgroud)

然后@m是一个List。AList是不可变的(因此它的大小在创建时隐式地固定),所以如果意图是大小不会发生意外变化,那已经是一个证书。不幸的是,最终目标没有说明。

如果真的想将传递的 immutableList转换为 shape Array,除了将其分配为新的固定大小之外别无他法Array

for (1..19).rotor(3, :partial) -> @l {
    my @arr[3] = @l;
}
Run Code Online (Sandbox Code Playgroud)

当然,如果:partial导致剩余元素,这将会爆炸;可以这样做:

for (1..19).rotor(3, :partial) -> @l {
    my @arr[@l.elems] = @l;
}
Run Code Online (Sandbox Code Playgroud)

为了避免这种情况。但是,如果目标真的是确保在有剩余 elems 时一切顺利,那么要么where

for (1..19).rotor(3, :partial) -> @m where .elems == 3 {
}
Run Code Online (Sandbox Code Playgroud)

或者,不太清楚,一个一次性的解构:

for (1..19).rotor(3, :partial) -> @m [$,$,$] {
}
Run Code Online (Sandbox Code Playgroud)

会做的。