【问题标题】:Raku operator overloadingRaku operator overloading
【发布时间】:2020-04-01 23:54:06
【问题描述】:

使用以下代码:

use v6d;

# sub circumfix:<α ω>( @a ) {
#     @a[0] >= @a[1] & @a[0] <= @a[2];
# };

sub circumfix:<α ω>( $a, $b, $c ) {
    $a >= $b & $a <= $c;
};

if (α <5 0 10> ω) {
    say 'Truthy';
}
else {
    say 'Falsey';
}

结果:

(base) hsmyers@BigIron:~/board$ perl6 ./op.p6
Too few positionals passed; expected 3 arguments but got 1
  in sub circumfix:<α ω> at ./op.p6 line 7
  in block <unit> at ./op.p6 line 11

而将注释块切换为其他定义会导致:

(base) hsmyers@BigIron:~/board$ perl6 ./op.p6
Truthy

损坏的版本(带有三个参数)是我想要的版本,有人可以解释为什么它会损坏吗?

【问题讨论】:

    标签: operator-overloading raku


    【解决方案1】:
    D:\>6e "say <5 0 10>"
    (5 0 10)
    

    这不是三个参数。它是三个值(IntStr 类型)的列表,因此是一个参数。

    【讨论】:

      【解决方案2】:

      &lt;5 0 10&gt; 从字面上构造一个List,一个单个 List

      一个类比是一个待办事项列表,一个待办事项列表。一个待办事项列表有多少东西?这是 1 - 一个待办事项列表。

      因此您会收到错误消息:

      expected 3 arguments but got 1

      您想要的是指定您想要 一个 值,该值本身由多个值组成。这是一种方法:

      sub circumfix:<α ω>( ( $a, $b, $c ) ) ...
      

      () 周围的额外包围导致 destructuring

      【讨论】:

      • 另一种方法是使用 slurpy 签名 (*@foo where .elems == 3),然后可以支持 α $a, $b, $c ωα ($a, $b, $c) ω
      • @user0721090601 子签名也支持。将签名的丰富性放入子签名中为编译器提供了比where 子句更多的知识,因此您可以获得例如更好的默认错误消息和调度速度。我发现where 子句最适合子签名无法处理的任意条件或定义完全自定义的错误消息(例如( *@ where { .elems == 3 or die "nope" } ))。请注意,您可以将这些组合起来:( *@ where { .elems == 3 or die "nope" } ($a, $b, $c) ) 让您在获得正确参数时解构为命名变量,在您没有获得正确参数时提供自定义错误消息。
      • ++ 多重签名可以避免 where,但我没有意识到可以使用匿名签名来解构,同时提供 where(我的意思是,我认为你 可以 只是从未见过示例,实际上它确实可读)
      • Yes to multis,比我建议在错误用例中滥用where 子句要好得多,可以通过多个签名来区分而无需where 子句。 (回想起来,当我的黑客本能如此完全不必要和不合适时,我对我的黑客本能的揭示感到尴尬!)Anyhoo,再投一个赞成票,并感谢您通过您的 cmets 改进我们的答案。 :)
      猜你喜欢
      • 2022-12-02
      • 2017-03-24
      • 2014-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多