我试图将 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] {
}
然而,这实际上似乎并不是一个解构问题,因为请求不是将传递的聚合分解成它的部分,而是将它转换为不同类型的聚合。
进一步看这个问题:
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
是 List
.一个 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;
}
为了避免这种情况。但是,如果目标真的是确保在有剩余 elems 时一切顺利,那么要么是
where
:for (1..19).rotor(3, :partial) -> @m where .elems == 3 {
}
或者,不太清楚,一个一次性的解构:
for (1..19).rotor(3, :partial) -> @m [$,$,$] {
}
会做的。
关于arrays - 如何将循环参数解构为固定大小的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61096690/