Raku kurss / Padziļināti / Apakšprogrammas

Daudzkārtēja nosūtīšana

Sadaļā “Pamati” jūs iepazināties ar multi-funkcijām: vairākām apakšprogrammām ar vienādu nosaukumu, kur Raku izvēlas pareizo, apskatot argumentu tipus. Šo mehānismu sauc par vairākkārtēju dispečēšanu (multiple dispatch).

Līdz šim izvēle tika veikta pēc argumentu tipa. where klauzula ļauj iet tālāk un veikt dispečēšanu arī pēc vērtības. Tā tiek rakstīta aiz parametra un satur nosacījumu, kuram argumentam jāatbilst, lai šis kandidāts tiktu izvēlēts:

multi sub info(Int $n where $n < 0)  { say "$n is negative" }
multi sub info(Int $n where $n == 0) { say "$n is zero" }
multi sub info(Int $n where $n > 0)  { say "$n is positive" }

info(-5);
info(0);
info(7);

Katrs izsaukums nonāk pie tā kandidāta, kura nosacījums ir patiess dotajai vērtībai:

-5 is negative
0 is zero
7 is positive

Visiem trim kandidātiem ir vienāda signatūra tipu ziņā — viens Int — tāpēc bez where klauzulām tie konfliktētu. Nosacījumi padara tos atšķirīgus.

Bāzes gadījums rekursijai

Bieži where lieto, lai nodrošinātu rekursijas apturēšanas punktu kā atsevišķu kandidātu. Šeit ir faktoriāls, sadalīts divās multi-apakšprogrammās:

multi sub fact(Int $n where $n <= 1) { 1 }
multi sub fact(Int $n)               { $n * fact($n - 1) }

say fact(5); # 120

Pirmais kandidāts apstrādā bāzes gadījumu ($n ir 1 vai mazāks) un vienkārši atgriež 1. Katra cita vērtība nonāk pie otrā kandidāta, kas izsauc fact vēlreiz ar mazāku skaitli. Funkcijā nav neviena if — bāzes gadījuma un rekursīvā soļa izvēli veic dispečeris.

Prakse

Jūs gaida 1 viktorīna par šī temata saturu.

Vingrinājumi

Šajā sadaļā ir 3 vingrinājumi. Pirms ķerieties pie vingrinājumiem, izlasiet visus šīs sadaļas tematus.

  1. Vairumtirdzniecības cenas
  2. Absolūtā vērtība
  3. Klasificēt izmēru

Kursa navigācija

Viktorīna — Kola izsaukums   |   Vairumtirdzniecības cenas