从函数返回多个数组时,是否可以避免创建临时标量:
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
结尾。
答案 0 :(得分:11)
都不是:
my ($x, $y) = func();
my (@x, @y) = func();
但不是以下任何一个
my (@x, @y) := func();
my ($x, $y) := func();
使用@
向P6发出信号,当它需要区分某些东西是单数(“单个数组”)还是复数(“单个数组中包含的项目”)时,应该是视为复数。
使用$
发出相反的信号-应该将其视为单数。
您以后总是可以通过执行$@x
来明确地扭转这种情况-表示P6应该对您最初声明为复数的事物使用单数透视图-或@$x
发出相反的信号。
打个比方,把蛋糕切成几块。是一件事还是一堆碎片?还请注意,@
会缓存片段的索引,而$
只记得那是一块蛋糕。对于大量事物,这可能会有很大的不同。