在Perl 6中分配嵌套列表

时间:2018-05-07 19:51:48

标签: perl6

我想,结果应该是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 个答案:

答案 0 :(得分:7)

没有任何错误(也就是说,P6中的普通任务是按照它的方式进行的),但是猜测你希望使双方的结构相同会导致$a获得{ {1}},1获得$b2获得$c

为此,您需要“绑定赋值”(也称为“绑定”),而不是普通的赋值:

3

请注意左侧列表前的冒号,使其成为签名文字,并在my ($a, $b, $c); :(($a, $b), $c) := ((1, 2), 3); 之前使用冒号,使其成为绑定操作。

答案 1 :(得分:5)

如果您希望结果为1, 2, 3,则必须Slip列表:

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

这是单一参数规则的结果:https://docs.perl6.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 :(得分:2)

你在问*这里有什么问题",我会说the single argument rule的某些变体正在起作用。由于括号仅用于分组,所以正在进行的是这项任务

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

(1, 2), 3表现为单个参数,因此它们可以轻松地分配给组中的第一个元素$a, $b。因此,他们得到了所有,而旧$c只获得任何。以这种方式看待它:

my ($a, $b, $c); 
($a, ($b, $c)) = ((1, 2), 3, 'þ'); 
say $a, $c; # OUTPUT: «(1 2)þ␤»

您可能希望查看使用»=«的{​​{3}},它正是您正在寻找的内容。这是this code by Larry Wall,所以你可能要稍等一下,直到它为止。