Курс 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Навігація курсом
← Тест — Масиви та списки | Вирівнювання та ітемізація →
💪 Або перейдіть одразу до вправ цього
розділу.