在Perl 6中分配嵌套列表

Eug*_*sky 8 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))
Run Code Online (Sandbox Code Playgroud)

这有什么不对?

rai*_*iph 7

没有什么不对(也就是说,P6中的普通任务是按照它所做的那样设计的),但是猜测你希望在两侧使结构相同会导致$a获得1,$b获得2$c获得3.

为此,你想要"绑定赋值"(又名"绑定"),而不是普通的赋值:

my ($a, $b, $c);
:(($a, $b), $c) := ((1, 2), 3);
Run Code Online (Sandbox Code Playgroud)

注意左边列表前面的冒号,使它成为签名文字,然后是冒号=,使其成为绑定操作.

  • 啊,REPL.REPL是......告诫者.我想[丰富的REPL](https://www.youtube.com/watch?v=tSZV8IXIsM4&t=0s&list=PLRuESFRW2Fa77XObvk7-BYVFwobZHdXdK&index=5)可能会做得更好. (2认同)
  • 有趣的是,Jupyter P6当然也是一个警告,它有同样的错误,或者更糟. (2认同)

Eli*_*sen 5

如果你想得到结果1, 2, 3,你必须Slip列出:

my ($a, $b, $c) = |(1, 2), 3;
Run Code Online (Sandbox Code Playgroud)

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

这也是为什么这只是有效的原因:

my ($a, $b, $c) = (1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

即使(1,2,3)List3个元素,由于相同的单个参数规则,它将自动滑动.您当然也可以删除(迷信)括号:

my ($a, $b, $c) = 1, 2, 3;
Run Code Online (Sandbox Code Playgroud)