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

How to destructure for loop parameters into array of fixed size?

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

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

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

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; }

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

所以 -> @m[3] 是您想要的,但这是为您的匿名块分配一个签名,该匿名块需要一个成形数组,并且您正在传递一个列表。

所以我最终所做的可能会将我的列表强制转换为一个有形数组。

for (1..19).rotor(3, :partial).map( { Array.new(:shape(3),$_ ) } ) -> @m[3] { say @m; }

然后它工作正常。不过,可能有更好的方法来做到这一点。

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

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

然而,这似乎并不是真正的解构问题,因为请求不是将传递的聚合分解成多个部分,而是将其转换为不同类型的聚合。

进一步看问题:

I am trying to put the parameters in a for loop into array of FIXED size.

问题是,rotor 根本不会产生(可变的)Array。相反,在写作时:

for (1..19).rotor(3, :partial) -> @m {
}

那么@m就是一个ListList 是不可变的(因此隐含地它的大小在创建时是固定的),所以如果意图是不会意外改变大小,那已经是一个证书。不幸的是,没有说明最终目标。

如果真的想将传递的不可变 List 变成有形的 Array,除了将其分配为新的固定大小 Array:

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

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

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

为了避免这种情况。但是,如果目标真的是确保在有剩余元素的情况下事情会爆炸,那么 where:

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

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

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

会做的。