Raku-Kurs / Objekte, Ein- und Ausgabe und Ausnahmen / Klassen und Objekte / Das Metaobjekt-Protokoll 🆕

Meta-Methoden

Eine Metamethode wird mit .^ statt mit . aufgerufen. Das gewöhnliche .method führt eine Methode des Objekts aus; das .^method ruft eine Methode auf dem Metaobjekt des Objekts auf — es fragt also nach dem Typ, statt als der Typ zu handeln.

Sie kennen bereits .^name, das den Namen des Typs liefert:

say 42.^name; # Int

Andere Metamethoden untersuchen den Aufbau eines Typs. .^attributes führt seine Attribute auf, und .^find_method sagt Ihnen, ob eine Methode existiert:

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 liefert die method resolution order — die Kette der Typen, die Raku der Reihe nach durchsucht, wenn es eine Methode nachschlägt. Sie ist die Vererbungslinie einer Klasse:

class A {}
class B is A {}

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

B erbt von A, und jeder Typ letztlich von Any und Mu, ein Methodenaufruf auf einem B wird also genau entlang dieses Pfads gesucht. Diese Metamethoden machen den Aufbau Ihrer Typen zu Daten, die Sie zur Laufzeit abfragen können.

Praxis

Lösen Sie 1 Quiz zum Inhalt dieses Themas.

Kursnavigation

Das Metaobjekt-Protokoll 🆕   |   Quiz — Das MOP


💪 Oder springen Sie direkt zu den Übungen dieses Abschnitts.