Курс по 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; # a plain copy

$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

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

Тест — Масиви и списъци   |   Изравняване и елементизация


💪 Или преминете направо към упражненията в този раздел.