Kurso de Raku / Progresinta / Subprogramoj

Multobla dissendo

En la parto Esencaĵoj vi renkontis multi-funkciojn: plurajn subrutinojn kiuj havas la saman nomon, kie Raku elektas la ĝustan laŭ la tipoj de la argumentoj. Tiu mekanismo nomiĝas multnivela sendo (multiple dispatch).

Ĝis nun, la elekto estis farita laŭ la tipo de la argumentoj. Frazo where ebligas iri plu kaj sendi ankaŭ laŭ la valoro. Ĝi estas skribita post parametro kaj enhavas kondiĉon, kiun la argumento devas plenumi por ke tiu kandidato estu elektita:

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);

Ĉiu voko iras al la kandidato, kies kondiĉo estas vera por la donita valoro:

-5 is negative
0 is zero
7 is positive

Ĉiuj tri kandidatoj havas la saman signaturon laŭ tipoj — unuopa Int — do sen la where-frazoj ili kolizius. La kondiĉoj igas ilin distinktaj.

Baza kazo por rekursio

Ofta uzo de where estas provizi la haltan punkton de rekursio kiel apartan kandidaton. Jen la faktorialo denove, dividita en du multi-subrutinojn:

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

say fact(5); # 120

La unua kandidato traktas la bazan kazon ($n de 1 aŭ malpli) kaj simple redonas 1. Ĉiu alia valoro iras al la dua kandidato, kiu vokas fact denove kun pli malgranda nombro. Ne estas if ene de la funkcio — la elekton inter baza kazo kaj rekursia paŝo faras la sendilo.

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.

  1. Vico-prezado
  2. Absoluta valoro
  3. Klasifiki la grandecon

Kursa navigado

Kvizo — La dupunkta voko   |   Vico-prezado