如何使用将在已定义的多方法之前调用的多方法来扩充类?
我正在尝试启用负下标:@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
通常的警告适用,并且由于每个数组索引操作都将为此付出代价,因此预计速度会显着放缓。