Курс Raku / Розширені / Контейнери / Упорядковані контейнери

Прив’язка з :=

Досі кожна створена вами змінна породжувала новий контейнер, а присвоєння через = клало значення всередину цього контейнера. Зв’язування, що записується як :=, працює інакше: воно змушує ім’я посилатися на наявний контейнер, а не створювати новий.

Після зв’язування два імені спільно володіють одним контейнером, тож зміна, зроблена через одне з них, видима через інше:

my $x = 10;
my $y := $x;

$x = 20;
say $y; # 20

Тут $y := $x не копіює значення 10. Воно робить $y іще одним іменем того самого контейнера, що й $x. Коли $x пізніше встановлюють у 20, читання $y теж повертає 20.

Порівняйте це зі звичайним присвоєнням, яке копіює значення в окремий контейнер:

my $x = 10;
my $y = $x; # звичайна копія

$x = 20;
say $y; # 10

Зв’язування працює й з масивами. Наведений код робить @alias іще одним іменем для @data:

my @data = 1, 2, 3;
my @alias := @data;

@alias[0] = 99;
say @data; # [99 2 3]

Ще одна деталь: якщо зв’язати ім’я безпосередньо з літеральним значенням, за ним не стоїть жодного контейнера, тож ім’я стає доступним лише для читання:

my $pi := 3.14;
$pi = 3;
Cannot assign to an immutable value
  in block <unit> at t.raku line 2

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

Тест — Масиви та списки   |   Вирівнювання та ітемізація


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