В заголовке вопроса упоминается деструктуризация, но речь идет о разборе чего-либо. Например, мы могли бы извлечь три элемента, используя его:
for (1..19).rotor(3, :partial) -> [$a, $b, $c] {
}
Однако, похоже, это не является проблемой деструктуризации, поскольку запрос не разбивает переданный агрегат на его части, но преобразовать его в агрегат другого типа.
Глядя немного дальше на вопрос:
Я пытаюсь поместить параметры в a для l oop в массив ИСПРАВЛЕНО размер.
Дело в том, что rotor
вообще не производит (изменяемые) Array
с. Вместо этого при записи:
for (1..19).rotor(3, :partial) -> @m {
}
Тогда @m
является List
. A List
является неизменным (и, следовательно, неявно его размер фиксируется при создании), поэтому, если предполагается, что не может быть случайного изменения размера, это уже сертификат. К сожалению, конечная цель не была указана.
Если вы действительно хотите превратить переданный неизменяемый List
в форму Array
, для него нет ничего, кроме как присвоить ему новый фиксированный размер Array
:
for (1..19).rotor(3, :partial) -> @l {
my @arr[3] = @l;
}
Конечно, это взорвется, если :partial
приведет к остаткам элементов; можно было бы сделать:
for (1..19).rotor(3, :partial) -> @l {
my @arr[@l.elems] = @l;
}
Чтобы избежать этого. Однако, если цель состоит в том, чтобы действительно взорвать вещи, если есть когда-либо оставшиеся элементы, то либо where
:
for (1..19).rotor(3, :partial) -> @m where .elems == 3 {
}
Или, чуть менее ясно, одноразовая деструктура:
for (1..19).rotor(3, :partial) -> @m [$,$,$] {
}
Сделал бы это.