Kurso de Raku / Progresinta / Subprogramoj
La Whatever-stelo
Vi eble vidis la * uzatan en esprimoj kiel
* * 2 aŭ * %% 2 dum vokado de map
kaj grep. Tiu * estas la
Whatever-stelo, kaj la esprimo ĉirkaŭ ĝi konstruas etan
unu-argumentan funkcion senvole. Ĉi tiu sekcio klarigas kio ĝi vere
estas, kiel ĝi rilatas al bloko, kaj kie la nuda stelo simple signifas
“kion ajn vi volas”.
Stelo kreas funkcion
Kiam * aperas en esprimo, Raku transformas la tutan
esprimon en funkcion — WhateverCode — en kiu la stelo
reprezentas la argumenton:
my $double = * * 2;
say $double.^name; # WhateverCode
say $double(21); # 42* * 2 estas funkcio kiu multiplikas sian unu argumenton
per du. Tial (1..5).map(* * 2) funkcias: map
ricevas ĝuste tian unu-argumentan funkcion.
Whatever kontraŭ bloko
Whatever-esprimo estas pli mallonga maniero skribi funkcion, kiun vi ankaŭ povus skribi kiel blokon. Ĉi tiuj tri estas ekvivalentaj:
* * 2
{ $_ * 2 }
-> $x { $x * 2 }La Whatever-formo ne nomas parametron; la blok-formo uzas la teman
variablon $_; la pintforma nomas $x. Tiu
lasta, -> $x { ... }, estas memstara malgranda funkcio —
vi renkontos ĝin ĝuste en Anonimaj funkcioj; ĉi tie
sufiĉas legi ĝin kiel trian manieron skribi la saman unu-argumentan
funkcion. Por simpla esprimo la stelo estas la plej kompakta, tial ĝi
estas tiel ofta kun map, grep, kaj
sort:
say (1..5).map(* * 2); # (2 4 6 8 10)
say (1..5).map({ $_ * 2 }); # (2 4 6 8 10)
say (1..5).map(-> $x { $x * 2 }); # (2 4 6 8 10)Uzu blokon kiam la logiko bezonas pli ol unu esprimon, aŭ kiam pli klara nomita parametro helpas. Uzu la stelon kiam mallonga esprimo diras ĉion.
Pli ol unu stelo
Ĉiu * en la esprimo estas aparta argumento, laŭ ordo. Do
du steloj kreas du-argumentan funkcion:
my $add = * + *;
say $add(3, 4); # 7Ĉi tie * + * estas du-argumenta funkcio kiu aldonas
siajn argumentojn — ekzemple kuranta sumo kaj la sekva elemento.
La nuda Whatever
Sole, * signifas “kion ajn” — tiom kiom ekzistas, aŭ sen
limo. Du ĉiutagaj uzoj:
my @a = 10, 20, 30;
say @a[*-1]; # 30 — * estas la tabellongo, do *-1 estas la lasta indekso
say (1..*).head(3); # (1 2 3) — 1..* estas senfinpunkta ampleksoEn @a[*-1] la stelo reprezentas la nombron de elementoj,
kaj en 1..* ĝi signifas “sen supra limo”. Ĉu ĝi konstruas
funkcion aŭ signifas “kion ajn vi volas”, la stelo estas unu el la plej
utilaj mallongigoj de Raku.
Praktiko
Vin atendas 1 kvizo pri la enhavo de ĉi tiu temo.
Ekzercoj
En ĉi tiu sekcio estas 3 ekzercoj. Trarigardu ĉiujn temojn de ĉi tiu sekcio antaŭ ol komenci la ekzercojn.