Curso de Raku / Objetos, entrada/salida y excepciones / Clases y objetos / El protocolo de metaobjetos 🆕
Añadir métodos en tiempo de ejecución
El MOP no sirve solo para inspeccionar: también puede
cambiar un tipo mientras el programa se ejecuta. El
metamétodo .^add_method añade un método nuevo a una
clase:
class Empty {
}
Empty.^add_method('greet', method { 'hi' });
say Empty.new.greet; # hiLa clase Empty se define sin ningún método.
Empty.^add_method('greet', …) le adosa entonces un método
llamado greet, dado como un method { … }
anónimo. A partir de ese momento todo objeto Empty responde
a .greet, igual que si estuviera escrito en la clase.
Esto es metaprogramación de verdad: se le está diciendo al metaobjeto
de Empty que le crezca un método nuevo. Ese mismo protocolo
está debajo de funcionalidades que ya has usado: conceptualmente, cuando
escribes class, role, has o
method, el compilador construye tu tipo por ti a través de
métodos del MOP como .^add_method y
.^add_attribute.
«Conceptualmente», porque esto es un modelo del lenguaje, no una
promesa sobre ningún compilador concreto. El MOP es aquello en
términos de lo cual está especificado el sistema de objetos; si una
implementación dada encamina realmente cada declaración a través de esos
metamétodos — y si puedes observarla haciéndolo — depende de esa
implementación. Por el mismo motivo, llamar tú mismo a estos
metamétodos depende de la implementación: cuáles expone un compilador, y
cómo se comportan exactamente, puede variar, así que el código que
recurre a .^add_method y compañía podría no ejecutarse
igual en todos los Raku.
Añadir métodos en tiempo de ejecución es una herramienta potente y rara vez necesaria. La mayoría de los programas nunca recurren a ella, pero es lo que hace abierto el sistema de objetos de Raku: las reglas de las clases están escritas a su vez en términos del MOP, así que puedes extenderlas. Para el código de todos los días, los metamétodos de inspección del tema anterior son la parte del MOP que realmente usarás.
Navegación del curso
← Quiz — El MOP | Encuentre un método →
💪 O ve directamente a los
ejercicios de esta sección.