Курс 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

Штучність

Іноді потрібно протилежне: захистити контейнер від сплощення, навіть усередині flat. Конструкція $(...) робить свій аргумент штучним — позначає результат як один елемент. Порівняйте попередній приклад із цим:

my @a = 1, 2, 3;
my @b = 4, 5;

say flat($(@a), @b); # ([1 2 3] 4 5)

Тут $(@a) зберігає @a як один елемент, тоді як @b усе одно сплощується у свої два значення. Це знову та сама ідея сигіла $: $ означає «розглядай це як одну річ».

Практика

Виконайте 1 тест за змістом цієї теми.

Навігація курсом

Прив’язка з :=   |   Тест — Вкладені масиви


💪 Або перейдіть одразу до вправ цього розділу.