Cursus Raku / Objecten, in- en uitvoer en excepties / Klassen en objecten / Het meta-objectprotocol 🆕

Meta-methoden

Een metamethode wordt met .^ in plaats van . aangeroepen. De gewone .method draait een methode van het object; de .^method roept een methode aan op het metaobject van het object — hij vraagt iets óver het type in plaats van als het type op te treden.

Je bent .^name tegengekomen, die de naam van het type teruggeeft:

say 42.^name; # Int

Andere metamethoden inspecteren de structuur van een type. .^attributes somt de attributen op, en .^find_method vertelt je of een methode bestaat:

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 geeft de method resolution order terug — de keten van typen die Raku in volgorde doorzoekt bij het opzoeken van een methode. Het is de overervingslijn van een klasse:

class A {}
class B is A {}

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

B erft van A, en elk type uiteindelijk van Any en Mu, dus een methodeaanroep op een B wordt precies langs dat pad gezocht. Deze metamethoden maken van de structuur van je typen gegevens die je tijdens het draaien kunt bevragen.

Praktijk

Maak de 1 quiz over de inhoud van dit onderwerp.

Cursusnavigatie

Het meta-objectprotocol 🆕   |   Quiz — Het MOP


💪 Of ga direct naar de oefeningen in deze sectie.