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 个元素?
问题的标题提到了解构,但那是关于将某些东西拆开。例如,我们可以使用它提取三个元素:
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)
会做的。
| 归档时间: |
|
| 查看次数: |
111 次 |
| 最近记录: |