@ 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
уже знаете все подписи? Он ищет или все эти вещи уже решены, когда он составлен?
И есть ли способ узнать во время выполнения, какой класс предоставил метод? Может быть, с каким-то вызовом в КАК? Это был бы удобный инструмент отладки, когда у меня есть мульти, я неправильно указал и обрабатывается в другом месте.