Corso di Raku / Oggetti, input/output ed eccezioni / Classi e oggetti / Il protocollo dei metaoggetti 🆕

Metametodi

Un metametodo si chiama con .^ invece che con .. Il .method ordinario esegue un metodo dell’oggetto; il .^method chiama un metodo sul metaoggetto dell’oggetto — chiede qualcosa sul tipo invece di agire come il tipo.

Hai incontrato .^name, che restituisce il nome del tipo:

say 42.^name; # Int

Altri metametodi ispezionano la struttura di un tipo. .^attributes elenca i suoi attributi e .^find_method ti dice se un metodo esiste:

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 restituisce il method resolution order — la catena di tipi che Raku percorre, nell’ordine, quando cerca un metodo. È la linea di ereditarietà di una classe:

class A {}
class B is A {}

say B.^mro.map(*.^name); # (B A Any Mu)

B eredita da A, e ogni tipo in ultima analisi da Any e Mu, quindi la chiamata di un metodo su un B viene cercata esattamente lungo quel percorso. Questi metametodi trasformano la struttura dei tuoi tipi in dati che puoi interrogare a runtime.

Pratica

Risolvi 1 quiz sul contenuto di questo argomento.

Il protocollo dei metaoggetti 🆕   |   Quiz — Il MOP


💪 Oppure vai direttamente agli esercizi di questa sezione.