我如何使用在已定义的方法之前会被调用的多方法来扩充一个类?
我试图使负标:@arr[-1]
在喜欢这个文章,但不改变源。
因此,我增加了Array:
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.
所以我的multi从来没有被称为:
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
应用的通常警告,并且由于每个数组索引操作都将支付此费用,因此预计会出现明显的下降。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句