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

How can I stop Raku collapsing a list containing a single list?

我有一个函数,我希望能够将列表的列表传递到该函数中,就像在这个人工示例中一样:

sub print_lists(@input) {
    .say for @input
}

my @list_of_two_lists = ((1, 2), (3, 4)); 
print_lists(@list_of_two_lists);

正如预期的那样,这给出了以下输出:

(1, 2)
(3, 4)

但如果我这样做:

my @list_of_one_list = ((1, 2)); 
print_lists(@list_of_one_list);

我得到这个输出:

1
2

即它将包含一个包含两个元素的列表的列表展平为一个包含两个元素的列表。

我做错了什么?如果我希望能够传入包含单个列表的列表,我需要做什么?

此行为是两个 Raku 功能的结果,这两个功能都值得了解。

第一个是Single Argument Rule。它非常重要,值得阅读文档,但关键要点是,当您传递单个列表时(就像您在 @list_of_one_list 中所做的那样),for 之类的结构将遍历列表中的每个项目而不是作为单个项目遍历列表。在本例中,这意味着遍历列表中的两项,12.

此时,您可能会想“但是 @list_of_one_list 中没有 两项 – 它只有一项:列表 (1, 2)”。但那是因为我们还没有理解第二点:在 Raku 中 ( and ) are not what makes something a list. Instead, using the , operator 是构建列表的原因。这可能需要一点点时间来适应,但它允许 Raku 在许多其他语言需要的地方将括号视为可选。

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

my @list_of_one_list = ((1, 2));
say @list_of_one_list;  # OUTPUT: «[1, 2]»
my @list-of-one-list = (1, 2),;
say @list-of-one-list;  # OUTPUT: «[(1, 2)]»

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

希望对您有所帮助:)