从函数返回多个数组时是否可以避免创建临时标量:
use v6;
sub func() {
my @a = 1..3;
my @b = 5..10;
return @a, @b;
}
my ($x, $y) = func();
my @x := $x;
my @y := $y;
say "x: ", @x; # OUTPUT: x: [1 2 3]
say "y: ", @y; # OUTPUT: y: [5 6 7 8 9 10]
我想避免创建临时变量$x
和$y
。注意:无法替换函数调用
my (@x, @y) = func()
因为assignment of a list to an Array
is eager因此返回的数组最终都在@x
。
不是:
my ($x, $y) = func();
my (@x, @y) = func();
但改为:
my (@x, @y) := func();
my ($x, $y) := func();
使用@
向P6发出信号,当需要区分某些东西是单数 - “单个数组” - 或复数 - “包含在单个数组中的项目”时 - 它应该被视为复数。
使用$
以相反的方式发出信号 - 它应该被视为单数。
你可以随后通过执行$@x
明确地反转这一点 - 信号P6应该使用单数透视图来表示你最初宣称为复数的东西 - 或者@$x
用信号反转相反的信号。
比喻一下,把蛋糕切成几块。是一件事还是一堆件?另请注意,@
缓存了碎片的索引,而$
只记得它是一块蛋糕。对于大量的东西,这可以产生很大的不同。