Raku kurss / Padziļināti / Konteineri / Konteksti 🆕
Vienuma un saraksta konteksts
Vēl divi konteksti nosaka, vai kaut kas tiek uzskatīts par
sarakstu ar vairākām vērtībām vai par vienu
elementu. Tā ir atšķirība, kas slēpjas aiz
@ un $ sigiliem.
Saraksta kontekstā masīvs izklājas savos elementos.
for cikls ievieto savu argumentu saraksta kontekstā, tāpēc
tas iterē cauri katram elementam:
my @a = 1, 2, 3;
my $count = 0;
$count++ for @a;
say $count; # 3Elementa kontekstā tas pats masīvs tiek uzskatīts par vienu
vērtību. $( … ) kontekstualizators piespiedu kārtā uzliek
elementa kontekstu, tāpēc tagad cikls redz tikai vienu lietu un izpildās
vienu reizi:
my @a = 1, 2, 3;
my $count = 0;
$count++ for $(@a);
say $count; # 1Tāpēc, piešķirot masīvu skalāram, tas tiek iesaiņots kā viens
elements, nevis kopēti tā elementi: my $x = @a ievieto
@a elementa kontekstā. Ņemiet vērā, ka šis vienīgais
elements var būt cits konteiners ar daudziem elementiem:
my @a = 1, 2, 3;
my $var = @a;
say $var; # [1 2 3]
say $var.WHAT; # (Array)Mainīgais $var tagad satur vienu (jo tas ir skalārs
konteiners) objektu, kas ir Array. To var viegli pierādīt,
apstrādājot $x kā masīva atsauci (kā to sauktu citās
valodās):
say $var[1]; # 2Atbilstošais @( … ) kontekstualizators dara pretējo —
piespiedu kārtā uzliek saraksta kontekstu.
Pastāv arī izlietnes konteksts (sink context) — izteikuma konteksts, kura vērtība tiek izmesta, piemēram, rinda, kas pastāv tikai sava blakusefekta dēļ. Kad vērtība nonāk izlietnes kontekstā bez noderīga pielietojuma, Raku var brīdināt par “bezjēdzīgu lietojumu” (useless use), kas ir noderīgs padoms, ka esat aizmirsis izmantot rezultātu.
Izvēlētais sigils ($ vai @) faktiski ir
konteksta izvēle, un kontekstualizatori $( ) un
@( ) ļauj to vajadzības gadījumā mainīt.
Prakse
Jūs gaida 1 viktorīna par šī temata saturu.
Kursa navigācija
← Viktorīna — Konteksti | Viktorīna — Vienuma konteksts →
💪 Vai arī dodieties tieši uz šīs sadaļas
vingrinājumiem.