Cursus Raku / Geavanceerd / Containers / Containers introspecteren
WHO en HOW
Twee extra introspectietools maken de set compleet: HOW
en WHO.
HOW
Elke waarde in Raku wordt ondersteund door een metaobject —
een object dat weet hoe het type van de waarde werkt. HOW
(afkorting van Higher Order Workings) geeft dat metaobject
terug:
my $x = 42;
say $x.HOW.^name; # Perl6::Metamodel::ClassHOWJe hebt het metaobject al die tijd gebruikt, misschien zonder het te
merken. De .^ in .^name is een methode-aanroep
die via HOW wordt gerouteerd. Deze twee regels zijn
equivalent:
my $x = 42;
say $x.^name; # Int
say $x.HOW.name($x); # IntDus $x.^name is gewoon een kortere manier om
$x.HOW.name($x) te schrijven. Merk op dat het object
opnieuw als argument wordt meegegeven: het metaobject wordt
gedeeld door elke waarde van het type, dus een meta-methode
krijgt te horen over welk object het gaat. De .^-vorm doet
dit automatisch voor je. (Voor name wordt het argument
toevallig genegeerd, maar het meegeven ervan is de correcte, algemene
vorm — sommige meta-methodes gebruiken het wel.)
Hetzelfde geldt voor andere meta-methodes die je kunt tegenkomen,
zoals .^methods, die de methodes opsomt waarop een waarde
reageert.
WHO
WHO geeft het package terug waartoe een naam
behoort — de tabel met symbolen die in die namespace zijn
gedefinieerd:
say Int.WHO.^name; # StashEen Stash (een symbooltabel-hash) wordt nuttig wanneer
je met modules werkt, waar het je de namen laat opzoeken die een module
definieert. We komen er op terug in het gedeelte over modules;
voor nu is het voldoende om te weten dat WHO bestaat en wat
het vertegenwoordigt.
Cursusnavigatie
← VAR
gebruiken | Een
variabele beschrijven →
💪 Of ga direct naar de oefeningen in deze
sectie.