Cursus Raku / Geavanceerd / Containers / Contexten
Item- en lijstcontext
Twee verdere contexten bepalen of iets wordt behandeld als een
lijst van meerdere waarden of als een enkel
item. Dit is het verschil achter de @- en
$-sigils.
In lijstcontext wordt een array uitgespreid tot zijn
elementen. Een for-lus plaatst zijn argument in
lijstcontext, zodat het over elk element itereert:
my @a = 1, 2, 3;
my $count = 0;
$count++ for @a;
say $count; # 3In itemcontext wordt dezelfde array behandeld als één enkele
waarde. De $( … )-contextomzetter dwingt itemcontext af,
zodat de lus nu slechts één ding ziet en één keer wordt uitgevoerd:
my @a = 1, 2, 3;
my $count = 0;
$count++ for $(@a);
say $count; # 1Dit is de reden waarom het toewijzen van een array aan een scalar
deze als een enkel item verpakt in plaats van de elementen te kopiëren:
my $x = @a plaatst @a in itemcontext. Merk op
dat dat enkele element een andere container kan zijn met veel items
erin:
my @a = 1, 2, 3;
my $var = @a;
say $var; # [1 2 3]
say $var.WHAT; # (Array)De variabele $var bevat nu een enkel (want het is een
scalaire container) object, dat een Array is. Je kunt dit
eenvoudig bewijzen door $x te behandelen als een soort
array-referentie (zoals je het in andere talen zou noemen):
say $var[1]; # 2De bijbehorende @( … )-contextomzetter doet het
tegenovergestelde en dwingt lijstcontext af.
Er is ook sink-context — de context van een statement waarvan de waarde wordt weggegooid, zoals een regel die alleen bestaat vanwege zijn neveneffect. Wanneer een waarde in sink-context terechtkomt zonder iets nuttigs te doen, kan Raku waarschuwen voor een “useless use”, wat een handige hint is dat je vergeten bent een resultaat te gebruiken.
De sigil die je kiest ($ versus @) is
eigenlijk een keuze van context, en de contextomzetters
$( ) en @( ) laten je deze waar nodig
overschrijven.
Praktijk
Maak de 1 quiz over de inhoud van dit onderwerp.
Cursusnavigatie
← Quiz — Contexten | Quiz — Itemcontext →
💪 Of ga direct naar
de oefeningen in deze sectie.