Cursus Raku / Geavanceerd / Subroutines
Aanroepen met een dubbele punt
Wanneer je een methode of een subroutine aanroept, zet je de
argumenten meestal tussen haakjes: @a.grep(* > 5). Raku
biedt een tweede vorm — zet een dubbele punt na de
naam, en alles na de dubbele punt wordt de argumentenlijst, helemaal
zonder haakjes:
say (1..10).grep: * %% 2; # (2 4 6 8 10)De dubbele punt in grep: doet hetzelfde als haakjes
zouden doen: (1..10).grep: * %% 2 betekent precies
(1..10).grep(* %% 2). De twee vormen zijn onderling
verwisselbaar:
say <a b c>.join('-'); # a-b-c
say <a b c>.join: '-'; # a-b-cDe dubbele-puntvorm is het prettigst bij methoden die een blok of een Whatever-expressie verwachten, omdat het een laag nesting wegneemt. Vergelijk:
my @a = 3, 1, 2;
say @a.sort({ $^b <=> $^a }); # haakjes om het blok
say @a.sort: { $^b <=> $^a }; # dubbele punt — geen sluithaakje nodigBeide printen (3 2 1), maar de versie met de dubbele
punt leest overzichtelijker, vooral wanneer het blok lang is.
Dit is het methode-aanroep equivalent van de aanroep zonder haakjes
die je al kent van lijstoperatoren zoals say 1, 2, 3 — daar
neemt say alles erna als argumenten. De enige regel om te
onthouden is dat de dubbele-puntvorm de rest van de
instructie als argumenten consumeert, dus hij moet aan het
einde van een aanroepketen staan. Daarom werkt
('a' .. 'z')>>.uc>>.ord.grep: 60 < * < 70:
grep is de laatste aanroep, en er is niets meer om na te
ketenen. Als je meer methoden wilt aanroepen, gebruik dan de vorm met
haakjes of groepeer de delen van de hele expressie om het duidelijk te
maken:
say (('a' .. 'z')».uc».ord.grep: 60 < * < 70)».chr # (A B C D E)Let op: combineer de dubbele punt niet met haakjes
als .grep:( ... ). Die schrijfwijze botst met de
handtekening-literaal-syntaxis :( ... ) en kan niet worden
geparseerd. Gebruik ofwel .grep( ... ) ofwel
.grep: ... — het een of het ander, niet allebei.
Praktijk
Maak de 1 quiz over de inhoud van dit onderwerp.
Oefeningen
Deze sectie bevat 3 oefeningen. Bekijk alle onderwerpen van deze sectie voordat je aan de oefeningen begint.