如何将循环参数解构为固定大小的数组?
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
就是一个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;
}
为了避免这种情况。但是,如果目标真的是确保在有剩余元素的情况下事情会爆炸,那么 where
:
for (1..19).rotor(3, :partial) -> @m where .elems == 3 {
}
或者,不太清楚,一次性解构:
for (1..19).rotor(3, :partial) -> @m [$,$,$] {
}
会做的。
我正在尝试将 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
就是一个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;
}
为了避免这种情况。但是,如果目标真的是确保在有剩余元素的情况下事情会爆炸,那么 where
:
for (1..19).rotor(3, :partial) -> @m where .elems == 3 {
}
或者,不太清楚,一次性解构:
for (1..19).rotor(3, :partial) -> @m [$,$,$] {
}
会做的。