Можно ли избежать создания временных скаляров при возврате нескольких массивов из функции:
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()
поскольку присвоение списка Array
стремится и, следовательно, оба возвращаемых массива попадают в @x
.
Ни одно из:
my ($x, $y) = func();
my (@x, @y) = func();
Но вместо одного из:
my (@x, @y) := func();
my ($x, $y) := func();
Используйте @
, чтобы сигнализировать P6, что, когда ему нужно различить, является ли что-то единственным — «один массив» — или множественным числом — «элементы, содержащиеся в одном массиве», — это следует рассматривать как множественное число.
Используйте $
, чтобы сигнализировать наоборот — его следует рассматривать как единственное число.
Вы всегда можете позже явно изменить это, выполнив $@x
-- чтобы указать, что P6 должен использовать перспективу единственного числа для чего-то, что вы изначально объявили множественным числом, -- или @$x
, чтобы сигнализировать об обратном.
Для аналогии подумайте о торте, разрезанном на несколько частей. Это что-то одно или набор кусочков? Также обратите внимание, что @
кэширует индексацию кусочков, тогда как $
просто запоминает, что это торт. Для больших списков вещей это может иметь большое значение.