Как я могу нарезать это, чтобы получить любой конкретный столбец или диагональ, которую я хочу?
Насколько я знаю, в настоящее время вы не можете использовать синтаксис срезов с фигурными массивами (несмотря на ваш комментарий "(строки просты)", который смущает меня за мой комментарий к вашему сообщению ).
Очевидное решение - сбросить форму и использовать синтаксис среза:
my @array = ( < 1 2 3 >, < 4 5 6 >, < 7 8 9 > );
say @array[1]; # 4 5 6 (second row)
say @array[1;*]; # same
say @array[*;1]; # 2 5 8 (second column)
Если вы хотите сохранить безопасность проверки границ при использовании фасонного массива (и / или совместимость массива C с фасонным собственным массивом, если я прав, это так), то вам, вероятно, придется хранить две копии массива вокруг, используя один, чтобы сохранить желаемый аспект массивов, другой - нарезать.
Как превратить список индексов в каждом измерении в правильную вещь, заключенную в квадратные скобки?
Каждый размерный срез перед последним листом должен отделяться от следующего ;
.
Мне пока неясно, является ли это ;
разделителем операторов (в нижнем индексе) или индикатором списка списка, или как программно преобразовать список индексов в эту форму. (Расследование продолжается.)
И, конечно, есть какой-то причудливый синтаксис, который не позволил бы мне сделать что-то сложное [для диагонального среза]:
say @array[*;{$++}]; # 1 5 9 (diagonal)
Первое разделенное поле ;
в индексе массива [...]
соответствует первому измерению в массиве, то есть строкам в массиве.
Указание *
означает, что вы хотите включить все строки, а не указывать конкретные строки.
Последнее поле соответствует листьям нижнего индекса, фактическим элементам, к которым осуществляется доступ.
Сначала я попробовал просто $++
, а не {$++}
, но это дало мне нулевой столбец для всех элементов, вероятно, потому что language / roast и / или Rakudo оценивают значение скалярного индекса только один раз за вызов оператора индекса [...]
. .
Затем я решил, что если индекс равен Callable , он будет вызван и может вызываться один раз в строке. И это сработало.
Я думаю, что соответствует этот код в Rakudo .
На первый взгляд это означает, что вы не можете использовать Callable
для расчета среза листа, и я отмечаю, что жаркое нарезки для "вычисленных индексов" не включает использование Callable
. Возможно, я просто не смотрю на это правильно.