Избегайте создания временных скаляров при возврате нескольких массивов

#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 для сигнала, обращенного наоборот.

Для аналогии представьте торт, разрезанный на несколько частей. Это одна вещь или куча частей? Также обратите внимание, что @ кэширует индексацию фрагментов, тогда как $ просто помнит, что это торт. Для больших списков вещей это может иметь большое значение.