我们可以使用该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解释=为键列表其发生次数对其重要.
| 归档时间: |
|
| 查看次数: |
120 次 |
| 最近记录: |