Курс языка программирования Raku / Продвинутый уровень / Контейнеры / Упорядоченные контейнеры
Сглаживание и элементизация
Когда вы помещаете один массив внутрь другого, Raku не объединяет их элементы автоматически. Рассмотрите следующую программу:
my @a = 1, 2, 3;
my @b = 4, 5;
my @c = @a, @b;
say @c.elems; # 2
say @c; # [[1 2 3] [4 5]]Массив @c содержит всего два элемента: массивы
@a и @b. Raku сохраняет каждый контейнер как
отдельный элемент, а не рассыпает его содержимое во внешний массив. То
же самое происходит, если значение помещается среди других:
my @a = 1, 2, 3;
my @d = 0, @a, 99;
say @d; # [0 [1 2 3] 99]Когда вам действительно нужна единая плоская последовательность,
запросите это явно с помощью функции flat:
my @a = 1, 2, 3;
my @b = 4, 5;
say flat(@a, @b); # (1 2 3 4 5)
say flat(@a, @b).elems; # 5Упаковка в элемент (Itemisation)
Иногда нужно противоположное: защитить контейнер от разворачивания,
даже внутри flat. Конструкция $(...)
упаковывает свой аргумент, помечая результат как один элемент.
Сравните предыдущий пример с этим:
my @a = 1, 2, 3;
my @b = 4, 5;
say flat($(@a), @b); # ([1 2 3] 4 5)Здесь $(@a) сохраняет @a как один элемент,
тогда как @b по-прежнему разворачивается в свои два
значения. Это снова идея сигила $: $ означает
«рассматривать это как одну вещь».
Практика
Пройдите 1 тест по содержанию этой темы.
Навигация по курсу
← Привязка с
помощью := | Тест — Вложенные
массивы →
💪 Или перейдите сразу к упражнениям этого
раздела.