我正试图将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; }
然后它工作得很好。也许还有更好的方法。