总方法和Perl 6中Bag变量的符号

Eug*_*sky 8 set bag perl6

我们可以使用该total方法知道a中所有权重的总和Bag.

> my $b = (1,2,1).Bag
Bag(1(2), 2)
> $b.total
3
Run Code Online (Sandbox Code Playgroud)

但是,如果我们使用的%印记,而不是$我们的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
Run Code Online (Sandbox Code Playgroud)

如果%b明确转换为Bag之前total,它的工作原理是:

> %b.Bag.total
3
Run Code Online (Sandbox Code Playgroud)

问题:我曾经认为,随着Set,Bag,SetHash等,采用的%印记是优选的.我错了吗?

rai*_*iph 11

绑定而不是分配

my %b := (1,2,1).Bag;
say %b.total
Run Code Online (Sandbox Code Playgroud)

绑定(带:=)右手边直接 绑定左手侧.在这种情况下,做了一个值Associative的作用被绑定 %b.

或者分配给 Bag

分配(带=)右侧分配(复制)值左侧的容器中.

您可以在首次绑定到a之后进行分配Bag,如下所示.

在赋值之前,my声明符会将合适的容器绑定到声明的变量.默认情况下,Hash如果变量有一个%sigil ,它将是一个容器.

但是您可以指定一个is绑定到与其sigil兼容的其他类型容器的变量:

my %b is Bag = 1,2,1;
say %b.total
Run Code Online (Sandbox Code Playgroud)

有了这个咒语,你需要使用=,因为,在时间操作遇到%b已经被绑定到Bag现在,你需要(副本)分配Bag.

通过这种方式,您可以简单地提供一个值列表(不需要显式键或Bagcoercer /构造函数),因为它=是根据左侧容器的需要Bag进行解释的,并且选择将RHS解释=为键列表其发生次数对其重要.

  • @EugeneBarsky`我的%b是BagHash = 1,2,1;``%b {2} = 3;``%b {1} ++` (5认同)
  • @EugeneBarsky` <ab c>`是`qw <ab c>`的缩写,所以`%h <ab c>`是`%h {qw <ab c>}`的缩写.因为你正在处理一个Int`2`而不是一个Str`"2"`,你不能使用`%h <2>`.(默认的Hash使用Str键,所以在这种情况下你可以使用`%h <2>`) (4认同)