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); # 120La 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.