如何在 Raku 中删除多方法

  • 本文关键字:删除 方法 Raku raku nqp
  • 更新时间 :
  • 英文 :


如何使用将在已定义的多方法之前调用的多方法来扩充类?

我正在尝试启用负下标:@arr[-1]就像本文一样,但不更改来源。

所以我用以下内容来增强数组:

augment class Array { 
proto method AT-POS(Array:D: Int:D $i where <0 ) {
say "AT-POS called";
my $pos = -1;
my $ix = $pos + self.elems;
return self.AT-POS($ix);
}
};

但正如文档中所述

Please note that adding a multi candidate that differs only
in its named parameters will add that candidate behind the already defined one
and as such it won't be picked by the dispatcher.

所以我的多重永远不会被称为:

say .signature for @arr.^method_table{'AT-POS'}.candidates ;
(Any:U SELF: int pos, *%_)
(Any:U SELF: Int:D pos, *%_)
(Any:U: Num:D pos, *%_)
(Any:U: Any:D pos, *%_)
(Any:D: int pos, *%_)
(Any:D: Int:D pos, *%_)
(Any:D: Num:D pos, *%_)
(Any:D: Any:D pos, *%_)
($: Any:U pos, *%_)
(Any:D: one, two, *%_)
(Any:D: one, two, three, *%_)
(Any:D: **@indices, *%_)
(List:D: int $pos, *%_)
(List:D: Int:D $pos, *%_)
(Array:D: int $pos, *%_)
(Array:D: Int:D $pos, *%_)  # Their
(Array: $a, *%_)
(Array:D: Int:D $pos, *%_)  # My

我希望在他们之前调用我的方法。如何修改调度程序?

命名参数不会成为问题;这里没有。问题是问题中的代码没有添加更具体的multi候选项,而是尝试替换proto。如果像这样添加multi候选项:

use MONKEY-TYPING;
augment class Array { 
multi method AT-POS(Array:D: Int:D $i where $i < 0) {
nextwith($i + self.elems)
}
}

然后,由于存在where条款,它将在没有条款的通常AT-POS候选人之前被考虑。由于标准候选者仍然适用,因此可以使用nextwith来服从它。使用上述augment,程序:

my @arr = 1, 2, 3;
my $idx = -1;
say @arr[$idx];

将输出3.

关于augment通常的警告适用,并且由于每个数组索引操作都将为此付出代价,因此预计速度会显着放缓。

最新更新