我认为,结果应该是
1, 2, 3
。> my ($a, $b, $c)
> (($a, $b), $c) = ((1, 2), 3)
(((1 2) 3) (Any))
> $a, $b, $c
((1 2) 3 (Any))
这里有什么问题吗?
1, 2, 3
。> my ($a, $b, $c)
> (($a, $b), $c) = ((1, 2), 3)
(((1 2) 3) (Any))
> $a, $b, $c
((1 2) 3 (Any))
这里有什么问题吗?
这并没有错(也就是说,P6中的普通赋值按照设计原本就是这样执行的),但我猜想您希望让两边的结构相同会使得$a
变成1
,$b
变成2
,$c
变成3
。
要实现这个目标,您需要使用“绑定赋值”(又称“绑定”),而不是普通赋值:
my ($a, $b, $c);
:(($a, $b), $c) := ((1, 2), 3);
如果您想让结果显示为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;
($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)þ»
»=«
,正好符合你的需求。它目前未有文档记录, 所以你可能需要等待一段时间直到有文档。