【问题标题】:total method and the sigil of a Bag variable in Perl 6Perl 6 中的总方法和 Bag 变量的印记
【发布时间】:2018-10-13 20:42:08
【问题描述】:

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

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

但是如果我们使用% sigil 而不是$ 来表示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

如果在total 之前将%b 显式转换为Bag,则可以:

> %b.Bag.total
3

问题:我曾经认为对于SetBagSetHash 等,使用% 印记更可取。我错了吗?

【问题讨论】:

    标签: set raku bag


    【解决方案1】:

    绑定而不是分配

    my %b := (1,2,1).Bag;
    say %b.total
    

    绑定(使用:=binds 右侧直接 左侧。在这种情况下,扮演Associative 角色的值将绑定 %b

    或分配给Bag

    分配(使用=assigns(复制)值右侧容器 在左侧。

    您可以在第一次绑定到Bag 后分配如下。

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

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

    my %b is Bag = 1,2,1;
    say %b.total
    

    使用此咒语,您需要使用 =,因为在遇到该运算符时,%b 已经绑定到 Bag,现在您需要分配(复制) Bag.

    通过这种方式,您只需提供一个值列表(不需要显式键或Bag 强制/构造函数),因为= 是根据其左侧容器的需要解释的,而@987654342 @ 选择将 = 的 RHS 解释为出现次数对其很重要的键列表。

    【讨论】:

    • 如果我有一个BagHash 并且想稍后添加新元素,我应该绑定还是分配?我应该如何添加新元素?
    • @EugeneBarsky my %b is BagHash = 1,2,1; %b{2} = 3; %b{1}++
    • @EugeneBarsky &lt;a b c&gt;qw&lt;a b c&gt; 的缩写,所以 %h&lt;a b c&gt;%h{qw&lt;a b c&gt;} 的缩写。由于您处理的是 Int 2 而不是 Str "2",因此您不能使用 %h&lt;2&gt;。 (默认 Hash 使用 Str 键,所以在这种情况下你可以使用%h&lt;2&gt;
    • @BradGilbert 谢谢,我不明白。所以%h{2}2 作为键,%h&lt;2&gt;'2',对吧?
    • @EugeneBarsky 没错。 &lt;&gt; 在这种情况下是一个引用结构。
    【解决方案2】:

    在 Perl 6 中,assignment to a container can be coercive,也就是说,它将值强制为容器的值。看到这个:

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

    另一方面,绑定binds the type of the container to the contained thing

    所以,答案:您仍然可以使用印记,但正如@raiph 上面所说,使用绑定,以便 Bag 或 BagHash 不会被强制转换为简单的 Hash。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      • 2021-09-28
      相关资源
      最近更新 更多