метод total и символ переменной Bag в Perl 6 - PullRequest
0 голосов
/ 03 мая 2018

Мы можем использовать метод total, чтобы узнать сумму всех весовых коэффициентов в Bag.

> my $b = (1,2,1).Bag
Bag(1(2), 2)
> $b.total
3

Но если мы используем % сигил вместо $ для нашего Bag, мы получим сообщение об ошибке.

> my %b = (1,2,1).Bag
{1 => 2, 2 => 1}
> %b.total
No such method 'total' for invocant of type 'Hash'. Did you mean 'cotan'?
  in block <unit> at <unknown file> line 1

Если %b явно преобразован в Bag до total, он работает:

> %b.Bag.total
3

Вопрос: Раньше я думал, что с Set, Bag, SetHash и т. Д. Использование символа % предпочтительнее. Я не прав?

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

В Perl 6 присвоение контейнеру может быть принудительным , то есть оно приводит значение к контейнеру. Смотрите это:

my $b = (1,2,1).Bag;
say $b.^name; # Bag

my %haШ = (1,2,1).Bag;
say  %haШ.^name; # Hash

Привязка, с другой стороны, привязывает тип контейнера к содержащейся вещи .

Итак, ответ : вы все еще можете использовать сигилу, но, как сказано выше @raiph, используйте связывание, чтобы Bag или BagHash не приводились к простому хэшу.

my %real-haШ := (1,2,1).Bag;
say %real-haШ.^name; # Bag
0 голосов
/ 03 мая 2018

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 = как список ключей, для которых важно число вхождений.

...