Курс языка программирования 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

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

Тест — Массивы и списки   |   Сглаживание и элементизация


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