Курс языка программирования 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 тест по содержанию этой темы.

Навигация по курсу

Привязка с помощью :=   |   Тест — Вложенные массивы


💪 Или перейдите сразу к упражнениям этого раздела.