gpt4 book ai didi

arrays - 在Perl 6中如何知道多值迭代期间的缺失值?

转载 作者:行者123 更新时间:2023-12-04 13:36:53 25 4
gpt4 key购买 nike

在多值迭代期间,如果我们用完所有值,则当前版本的Rakudo中将不处理最后一组值。

my @arr = 1, 2, 3, 4, 5, 6
for @arr -> $a, $b, $c, $d {
say $a
say $b
say $c
say $d
}

结果是
1
2
3
4

,它会删除 56

那么,我可以通过哪种方式删除要删除的元素?

最佳答案

@choroba's reply所述,您的代码实际上在Perl 6.c中引发了错误。

错误发生在第二次迭代中,当输入数组中只剩下5, 6时,由于该签名中的所有四个参数都是必需的,因此无法映射到签名$a, $b, $c, $d

有多种方法可以使其工作:

A)将参数标记为可选。

for @arr -> $a, $b?, $c?, $d? {
say "---";
say $a;
say $b if $b.defined;
say $c if $c.defined;
say $d if $d.defined;
}
?表示可选-即,当没有参数传递给该参数时,它将设置为 Mu值(“最不确定”)。请注意,无需将第一个参数标记为可选参数,因为当输入元素剩余为零时, for循环终止,并且不会尝试输入其他迭代。
输出:
---
1
2
3
4
---
5
6

B)指定参数的默认值。

for @arr -> $a, $b = 'default-B', $c = 'default-C', $d = 'default-D' {
say ($a, $b, $c, $d);
}

这就是@choroba已经提出的建议。从本质上讲,这是使参数成为可选参数的另一种方法,但是现在有了自定义值,而不是 Mu,以防万一没有参数传递给它们。
输出:
(1 2 3 4)
(5 6 default-C default-D)

C)使用 .rotor处理分区。

使用带有多参数签名的 for块不是一次n次迭代值列表的唯一方法。 .rotor方法以更实用的样式提供了相同的功能。默认情况下,它会在最后跳过部分迭代,因此您需要给它提供 :partial选项以包括该迭代:

for @arr.rotor(4, :partial) -> @slice {
say @slice;
}

对于每个迭代, @slice变为4个元素的列表,但最后一次迭代可以包含更少的元素。(您可以在循环体内检查 @slice.elems来查看有多少个元素。)
输出:
(1 2 3 4)
(5 6)

关于arrays - 在Perl 6中如何知道多值迭代期间的缺失值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44224878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com