Я думаю, что это случай Broken By Design.Рассмотрим следующий фрагмент:
my $a = Point.new(:3x, :2y);
my $b = Point.new(:2x, :4y);
say &infix:<cmp>.WHICH;
say $a cmp $b;
{
multi sub infix:<cmp>(Point $a, Point $b) { $a.y cmp $b.y || $a.x cmp $b.x }
say &infix:<cmp>.WHICH;
say $a cmp $b;
}
say &infix:<cmp>.WHICH;
say $a cmp $b;
Определение нового мульти-кандидата создаст новый подпротокол, который будет виден только лексически.Так как метод sort
определен в настройке (концептуально, охватывающая область видимости), он не увидит вашего нового кандидата-мульти.
Возможно, будет возможно заставить sort
искать &infix:<cmp>
динамическивместо лексического, хотя я подозреваю, что такое изменение должно было бы ждать 6.e, даже если бы мы решили, что это то, что мы хотим сделать, а это не дано.
В качестве обходного пути вы могли бы сделать что-токак
constant CMP = &infix:<cmp>;
multi sub infix:<cmp>(Point $a, Point $b) { ... }
BEGIN CMP.wrap(&infix:<cmp>);
на данный момент, хотя я не обязательно рекомендую это (возиться с глобальным состоянием, которое считается вредным, и всем этим джазом) ...