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



我正试图将for循环中的参数放入FIXED大小的数组中。这就是我一直在做的(我想使用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个元素呢?

问题的标题提到了析构函数,但这是关于分解一些东西。例如,我们可以使用它提取三个元素:

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

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

再看一点这个问题:

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

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

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

则CCD_ 3是CCD_。List是不可变的(因此它的大小在创建时是固定的(,所以如果其意图是大小不会发生意外变化,那就已经是确定的了。不幸的是,最终目标没有说明。

如果真的想把传递的不可变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 [$,$,$] {
}

会的。

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

因此,我最终所做的可能会将我的列表强制成一个成形的数组。

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

然后它工作得很好。也许还有更好的方法。

最新更新