Curso de Raku / Objetos, entrada/salida y excepciones / Clases y objetos / El protocolo de metaobjetos 🆕
Metamétodos
Un metamétodo se llama con .^ en lugar de con
.. El .method ordinario ejecuta un método del
objeto; el .^method llama a un método sobre el
metaobjeto del objeto: pregunta algo sobre el tipo en
lugar de actuar como el tipo.
Ya conoces .^name, que devuelve el nombre del tipo:
say 42.^name; # IntOtros metamétodos inspeccionan la estructura de un tipo.
.^attributes enumera sus atributos y
.^find_method te dice si un método existe:
class Animal {
has $.name;
method speak { 'generic' }
}
say Animal.^attributes.elems; # 1
say so Animal.^find_method('speak'); # True
say so Animal.^find_method('fly'); # False.^mro devuelve el method resolution order: la
cadena de tipos que Raku recorre, en orden, al buscar un método. Es la
línea de herencia de una clase:
class A {}
class B is A {}
say B.^mro.map(*.^name); # (B A Any Mu)B hereda de A, y todo tipo en última
instancia de Any y Mu, así que una llamada a
un método sobre un B se busca exactamente por ese camino.
Estos metamétodos convierten la estructura de tus tipos en datos que
puedes consultar en tiempo de ejecución.
Práctica
Resuelve 1 cuestionario sobre el contenido de este tema.
Navegación del curso
← El protocolo de metaobjetos 🆕 | Quiz — El MOP →
💪 O ve directamente a los
ejercicios de esta sección.