¿Cómo encuentra un objeto Perl 6 un método múltiple que podría estar en una clase o rol principal?
Considere este ejemplo donde una subclase tiene un método múltiple sin firma y uno con un parámetro 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;
¿Cómo se estructura la búsqueda de métodos? Estoy buscando más una forma de explicarlo y específicamente no me quejo de eso.
Int method
Str method
Rat method
Default
----------
Int method
Str method
Rat method
Bar slurpy method
Bar method
Hay una llamada aBar
'sdo-it
con1
por ejemplo. Algunas personas razonables podrían pensar que busca una firma coincidente enBar
primero y esa lechada nunca dejaría que nada lo pasara. Sin embargo, la llamada encuentra el multi correcto en la cadena de herencia.
HaceBar
ya conoces todas las firmas? ¿Busca o todo eso ya está resuelto cuando está compuesto?
Y, ¿hay alguna manera de averiguar en el tiempo de ejecución qué clase proporcionó el método? Tal vez con alguna llamada a CÓMO? Esta sería una herramienta de depuración útil cuando tengo un multi que he especificado incorrectamente y se está manejando en otro lugar.