Bind вместо assign
my %b := (1,2,1).Bag;
say %b.total
Связывание (с :=
) связывает с правой стороны напрямую с с левой стороны. В этом случае значение, которое выполняет роль Associative
, связывается с %b
.
Или присвоить Bag
Назначение (с =
) назначение (копий) значений из с правой стороны в в контейнер слева.
Вы можете назначить после первой привязки Bag
следующим образом.
Непосредственно перед присваиванием декларатор my
свяжет подходящий контейнер с объявленной переменной. По умолчанию это будет контейнер Hash
, если переменная имеет %
сигил.
Но вы можете указать переменную is
, привязанную к контейнеру другого типа, который совместим с его символом:
my %b is Bag = 1,2,1;
say %b.total
С этим заклинанием вам нужно использовать =
, потому что к тому времени, когда этот оператор встречается, %b
уже был привязан к Bag
, и теперь вам нужно присвоить (скопировать) в Bag
.
Таким образом, вы получаете простоту предоставления списка значений (без явных ключей или Bag
coercer / constructor необходимо), поскольку =
интерпретируется в соответствии с потребностями контейнера слева, а Bag
решает интерпретировать RHS =
как список ключей, для которых важно число вхождений.