我正在玩这个小东西,一个集合可以通过翻转测试来作为其补充。为了使该工作有效,我创建了成员运算符的特殊版本。class Complement { has $.set; }multi infix:<∈> ( $a, Complement:D $c ) { $a ∉ $c.set }multi infix:<∉> ( $a, Complement:D $c ) { $a ∈ $c.set }my $set = (1, 2, 3).Set;my $c = Complement.new: set => $set;put 3 ∈ $set;put 4 ∈ $c;根据我对infix:<∉>的定义,另一个更一般的定义似乎已经消失了。没有其他候选人:TrueCannot resolve caller infix:<∉>(Int, Set); none of these signatures match: ($a, Complement:D $c) in sub infix:<∈> at /Users/brian/Desktop/complement.p6 line 11 in block <unit> at /Users/brian/Desktop/complement.p6 line 18要保留具有不同签名的先前定义,我该怎么做? 最佳答案 这是因为&infix:<∈>是multi,而&infix:<∉>不是:$ perl6 -e '&infix:<∈>.candidates.head.multi.say'True$ perl6 -e '&infix:<∉>.candidates.head.multi.say'False定义multi &infix:<∉>时,您从核心遮蔽了only &infix:<∉>,这就是为什么只看到应聘者的原因。我们可能可以检测到这种情况,并要求用户提供明确的proto来阐明它们的含义。我将其归档为R#1530。我会说这样的差异:一个op是multi而另一个是only是具有一致核心的更大问题的一部分。我将其添加为对RT#130020的评论,并在我们的D#1783文档中提到了该问题。您可以这样定义您的自定义操作(如果实现了R#1530中的建议,则必须使用proto;当前不是):proto infix:<∉> (|) {*}multi infix:<∉> ($a, Complement:D $c) { $a ∈ $c.set }multi infix:<∉> (|c) { &CORE::infix:<∉>(|c) }我只能猜测您要编码的内容,但我想提及一下,以便您在创建过程中考虑它:否定操作定义为not A (op) B,而不是A (not(op)) B。当涉及到Junctions时,这种小的差异会产生影响:$ perl6 -e 'say 2 ≠ 2|4'False如果将其定义为应用于每个操作数的取反运算符,则以上内容将等效于(2 ≠ 2 or 2 ≠ 4),并且始终为True,这通常不是程序员想要的,因此为什么将其计算为要回答Jarrod对OP的评论:子句(包括通过声明自定义运算符进行的语法变异)是词汇,因此,如果将声明包装到not (2 == 2 or 2 == 4)块中,则自定义op的作用域将仅限于该块。它似乎可以在REPL中使用的原因是,实际上存在一个错误(RT#131900),在REPL行之间丢失了自定义操作,就像BEGIN块一样,在调用带有指定给args的args时核心候选人,自定义多重不再是范围。关于raku - 在定义了更具体的multi之后,我的Perl 6运算符去了哪里?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48819031/ 10-11 07:04