Corso di Raku / Oggetti, input/output ed eccezioni / Classi e oggetti / Il protocollo dei metaoggetti 🆕
Aggiungere metodi a runtime
Il MOP non serve solo per ispezionare: può anche
cambiare un tipo mentre il programma gira. Il
metametodo .^add_method aggiunge un nuovo metodo a una
classe:
class Empty {
}
Empty.^add_method('greet', method { 'hi' });
say Empty.new.greet; # hiLa classe Empty è definita senza alcun metodo.
Empty.^add_method('greet', …) vi attacca poi un metodo di
nome greet, dato come method { … } anonimo. Da
quel momento in poi ogni oggetto Empty risponde a
.greet, esattamente come se il metodo fosse stato scritto
nella classe.
Questa è vera metaprogrammazione: si sta dicendo al metaoggetto di
Empty di farsi crescere un nuovo metodo. Lo stesso
protocollo sta sotto funzionalità che hai già usato — concettualmente,
quando scrivi class, role, has o
method, il compilatore costruisce il tuo tipo per tuo conto
attraverso metodi MOP come .^add_method e
.^add_attribute.
«Concettualmente», perché questo è un modello del linguaggio, non una
promessa su un compilatore particolare. Il MOP è ciò in termini di
cui il sistema a oggetti è specificato; se una data implementazione
instradi davvero ogni dichiarazione attraverso quei metametodi — e se tu
possa osservarla mentre lo fa — dipende da quell’implementazione. Per lo
stesso motivo, chiamare tu stesso questi metametodi dipende
dall’implementazione: quali un compilatore esponga, e come si comportino
esattamente, può variare, quindi il codice che ricorre a
.^add_method e simili potrebbe non girare allo stesso modo
su ogni Raku.
Aggiungere metodi a runtime è uno strumento potente e raramente necessario. La maggior parte dei programmi non vi ricorre mai, ma è ciò che rende aperto il sistema a oggetti di Raku: le regole delle classi sono a loro volta scritte in termini del MOP, quindi puoi estenderle. Per il codice di tutti i giorni, i metametodi di ispezione dell’argomento precedente sono la parte del MOP che userai davvero.
Navigazione del corso
← Quiz — Il MOP | Trovate un metodo →
💪 Oppure vai direttamente agli esercizi di questa sezione.