我有一个函数,我希望能够向其中传递一个列表列表,就像这个人为的例子一样:
sub print_lists(@input) {
.say for @input
}
my @list_of_two_lists = ((1, 2), (3, 4));
print_lists(@list_of_two_lists);
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,这给出了以下输出:
(1, 2)
(3, 4)
Run Code Online (Sandbox Code Playgroud)
但如果我这样做:
my @list_of_one_list = ((1, 2));
print_lists(@list_of_one_list);
Run Code Online (Sandbox Code Playgroud)
我得到这个输出:
1
2
Run Code Online (Sandbox Code Playgroud)
即,它将包含两个元素的一个列表的列表展平为两个元素的单个列表。
我究竟做错了什么?如果我希望能够传入包含单个列表的列表,我需要做什么?
cod*_*ons 17
这种行为是 Raku 两个特性的结果,这两个特性都值得了解。
\n第一个是单一参数规则。它非常重要,值得阅读文档,但关键的一点是,当您传递单个列表(就像在 with 中所做的那样@list_of_one_list)时,构造for会迭代列表中的每个项目,而不是作为列表遍历列表单个项目。在本例中,这意味着迭代列表中的两项 、1和2。
此时,您可能会想“但其中没有@list_of_one_list两项\xe2\x80\x93 它只有一项:列表”。但这是因为我们还没有理解第二点:在 Raku 中,和并不是使某些东西成为列表的原因。相反,使用运算符来构造列表。这可能需要一点时间来适应,但这使得 Raku 在许多其他语言需要括号的地方将括号视为可选。(1, 2)(),
要了解第二点的作用,我建议您查看如何.raku打印您的@list_of_lists. 比较:
my @list_of_one_list = ((1, 2));\nsay @list_of_one_list; # OUTPUT: \xc2\xab[1, 2]\xc2\xbb\nmy @list-of-one-list = (1, 2),;\nsay @list-of-one-list; # OUTPUT: \xc2\xab[(1, 2)]\xc2\xbb\nRun Code Online (Sandbox Code Playgroud)\n这就是回答您的问题所需的全部信息:只需,在构建一个列表的列表时添加一个即可。
我希望这有帮助:)
\n| 归档时间: |
|
| 查看次数: |
144 次 |
| 最近记录: |