如何阻止 Raku 折叠包含单个列表的列表?

Hiv*_*ves 8 raku

我有一个函数,我希望能够向其中传递一个列表列表,就像这个人为的例子一样:

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会迭代列表中的每个项目,而不是作为列表遍历列表单个项目。在本例中,这意味着迭代列表中的两项 、12

\n

此时,您可能会想“但其中没有@list_of_one_list两项\xe2\x80\x93 它只有一项:列表”。但这是因为我们还没有理解第二点:在 Raku 中,并不是使某些东西成为列表的原因。相反,使用运算符来构造列表。这可能需要一点时间来适应,但这使得 Raku 在许多其他语言需要括号的地方将括号视为可选。(1, 2)(),

\n

要了解第二点的作用,我建议您查看如何.raku打印您的@list_of_lists. 比较:

\n
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\n
Run Code Online (Sandbox Code Playgroud)\n

这就是回答您的问题所需的全部信息:只需,在构建一个列表的列表时添加一个即可。

\n

我希望这有帮助:)

\n

  • 非常清楚,谢谢! (2认同)