Perl 6中嵌套列表的赋值

9
我认为,结果应该是 1, 2, 3
> my ($a, $b, $c)
> (($a, $b), $c) = ((1, 2), 3)
(((1 2) 3) (Any))
> $a, $b, $c
((1 2) 3 (Any))

这里有什么问题吗?

3个回答

7

这并没有错(也就是说,P6中的普通赋值按照设计原本就是这样执行的),但我猜想您希望让两边的结构相同会使得$a变成1$b变成2$c变成3

要实现这个目标,您需要使用“绑定赋值”(又称“绑定”),而不是普通赋值:

my ($a, $b, $c);
:(($a, $b), $c) := ((1, 2), 3);

请注意左侧列表前面的冒号,使其成为签名文本,以及等号前面的冒号,使其成为绑定操作。

在 <未知文件> 的 <单元> 中的第 1 行,变量名为 '$a' 的词法块在此框架中不存在。 - Eugene Barsky
嗨@raiph,谢谢! 它在文件中可以工作,但在REPL中却奇怪地给出了这个消息。 - Eugene Barsky
2
啊,REPL。REPL是...请注意风险。我想象一下完善的REPL或许会更好。 - raiph
2
有趣的是,当然也要注意风险,Jupyter P6 要么出现了相同的错误,要么更糟。 - raiph
对我来说是一堂课。 - Eugene Barsky

5

如果您想让结果显示为1, 2, 3,则必须对列表进行滑动(Slip)操作:

my ($a, $b, $c) = |(1, 2), 3;

这是单参数规则的结果: https://docs.raku.org/type/Signature#Single_Argument_Rule_Slurpy

这也是为什么这个可以实现:

my ($a, $b, $c) = (1, 2, 3);

尽管 (1,2,3) 是一个有 3 个元素的列表List,但由于相同的单个参数规则,它会自动解包。当然,您也可以只是删除(迷信的)括号:

my ($a, $b, $c) = 1, 2, 3;

2
您正在询问“这里有什么问题”,我会说单参数规则的某个变体正在起作用。由于括号仅在此处用于分组,因此正在进行以下赋值。
($a, $b), $c = (1, 2), 3

"(1, 2), 3"作为单个参数进行处理,因此它们被赋值给你的组中的第一个元素$a, $b。 因此,它们得到了全部内容,而可怜的$c只得到了Any。可以这样理解:".
my ($a, $b, $c); 
($a, ($b, $c)) = ((1, 2), 3, 'þ'); 
say $a, $c; # OUTPUT: «(1 2)þ␤»

你可能想要看看 Larry Wall 的 这段代码,它使用了 »=«,正好符合你的需求。它目前未有文档记录, 所以你可能需要等待一段时间直到有文档。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接