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