Raku-Kurs / Fortgeschritten / Container / Introspektion von Containern

WHO und HOW

Zwei weitere Introspektionswerkzeuge vervollständigen die Reihe: HOW und WHO.

HOW

Jeder Wert in Raku wird von einem Metaobjekt gestützt — einem Objekt, das weiß, wie der Typ des Wertes funktioniert. HOW (kurz für Higher Order Workings) gibt dieses Metaobjekt zurück:

my $x = 42;
say $x.HOW.^name; # Perl6::Metamodel::ClassHOW

Du hast das Metaobjekt die ganze Zeit verwendet, vielleicht ohne es zu bemerken. Das .^ in .^name ist ein Methodenaufruf, der über HOW geleitet wird. Diese beiden Zeilen sind gleichwertig:

my $x = 42;
say $x.^name;        # Int
say $x.HOW.name($x); # Int

$x.^name ist also nur eine kürzere Schreibweise für $x.HOW.name($x). Beachte, dass das Objekt erneut als Argument übergeben wird: Das Metaobjekt wird von jedem Wert des Typs gemeinsam genutzt, daher wird einer Meta-Methode mitgeteilt, nach welchem Objekt gefragt wird. Die .^-Form erledigt das automatisch für dich. (Bei name wird das Argument zufällig ignoriert, aber es zu übergeben ist die korrekte, allgemeine Form — einige Meta-Methoden verwenden es tatsächlich.)

Dasselbe gilt für andere Meta-Methoden, die dir begegnen können, wie .^methods, die die Methoden auflistet, auf die ein Wert reagiert.

WHO

WHO gibt das Paket zurück, zu dem ein Name gehört — die Symboltabelle, die in diesem Namensraum definiert ist:

say Int.WHO.^name; # Stash

Ein Stash (ein Symboltabellen-Hash) wird nützlich, wenn du mit Modulen arbeitest, da er dir ermöglicht, die Namen nachzuschlagen, die ein Modul definiert. Wir kommen darauf im Abschnitt über Modul-Introspektion zurück; für den Moment reicht es zu wissen, dass WHO existiert und was es darstellt.

Kursnavigation

VAR verwenden   |   Eine Variable beschreiben


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