@ raiph Я помню, что прочитал код для этого, но не могу вспомнить, где он находится в ядре. Было бы лучше, если бы вы могли дать нам ссылку на исходный код.

отрим пример, в котором подкласс имеет метод multi без подписи и метод с параметром slurpy:

class Foo {
    multi method do-it { put "Default" }
    multi method do-it ( Int $n ) { put "Int method" }
    multi method do-it ( Str $s ) { put "Str method" }
    multi method do-it ( Rat $r ) { put "Rat method" }
    }

class Bar is Foo {
    multi method do-it { put "Bar method" }
    multi method do-it (*@a) { put "Bar slurpy method" }
    }

Foo.new.do-it: 1;
Foo.new.do-it: 'Perl 6';
Foo.new.do-it: <1/137>;
Foo.new.do-it;

put '-' x 10;

Bar.new.do-it: 1;
Bar.new.do-it: 'Perl 6';
Bar.new.do-it: <1/137>;
Bar.new.do-it: 5+3i;
Bar.new.do-it;

Как устроен метод поиска? Я больше ищу способ объяснить это и конкретно не жаловаться на это.

Int method
Str method
Rat method
Default
----------
Int method
Str method
Rat method
Bar slurpy method
Bar method

Там звонокBar«sdo-it с1 например. Некоторые разумные люди могут подумать, что он ищет подходящую подпись вBar во-первых, и эта грязь никогда не позволит этому пройти. Тем не менее, вызов находит правильный мульти в цепочке наследования.

Есть лиBar уже знаете все подписи? Он ищет или все эти вещи уже решены, когда он составлен?

И есть ли способ узнать во время выполнения, какой класс предоставил метод? Может быть, с каким-то вызовом в КАК? Это был бы удобный инструмент отладки, когда у меня есть мульти, я неправильно указал и обрабатывается в другом месте.

Ответы на вопрос(0)

Ваш ответ на вопрос