13 - match kifejezések¶
Volt az inteket tároló lista adatszerkezetünk:
1 2 3 |
|
1 2 3 4 5 |
|
- Egy értékre való mintaillesztést a match kulcsszó vezet be (
érték match
alakban) - Ezután kapcsos zárójelen belül jönnek az esetek
- Fentről lefelé
case mintaX => kifejezésX
alakban: ha az illesztettérték
illik amintaX
mintára, akkor az egész match kifejezés értékekifejezésX
értéke lesz, különben illeszti a következőt, amíg nem találja meg az első illeszkedést. - Hogy nézhet ki egy minta?
- lehet egy azonosító. Ez mindenre illeszkedik, rögzíti (bindeli) az azonosítóhoz
az illesztett értéket, és a
=>
jobb oldalán ezt az értéket helyettesítjük be az azonosító helyére. - lehet egy érték. Ez akkor illeszkedik, ha egyenlő az illesztett értékkel.
- lehet egy
C(P1,...,Pn)
alakú kifejezés, aholC
egy case class neve, melynekn
mezője van. Ez akkor illeszkedik, ha a bejövő érték szintén ennek aC
case classnak egy példánya, az első mezője illeszkedik aP1
, a második aP2
,..., azn
-edik (utolsó) mezője aPn
mintára. Ha minden illeszkedik és az al-mintákban volt azonosító bindelés, akkor ezek mind átmigrálnak a jobb oldalra.
- lehet egy azonosító. Ez mindenre illeszkedik, rögzíti (bindeli) az azonosítóhoz
az illesztett értéket, és a
Amit a fentebbi kódban láttunk, az az első és a harmadik eset kombinációjaként áll elő. Például, ha a sum függvény megkapja a list=NemuresLista(3,NemuresLista(2,UresLista()))
értéket, akkor mi történik:
- az első case nem illeszkedik, hiszen az egy
UresLista
case class példányra illeszkedne,list
pedig egyNemuresLista
- a második case addig biztosan illeszkedik, hogy
NemuresLista
a minta is, meg az érték is, amire illesztjük. Ekkor tehát a minta akkor illeszkedik, ha stimmelnek a mezők is: azaz, ha ah
(azonosító) illeszkedik a3
, at
(azonosító) pedig aNemuresLista(2,UresLista())
értékre. Ezek illeszkednek, hiszen változók, tehát a match kifejezés értékét úgy kapjuk, hogy ah+sum(t)
kifejezésbenh
helyébe a3
,t
helyébe pedig aNemuresLista(2,UresLista())
értéket helyettesítjük és ezt a kapott kifejezést kiértékeljük, tehát:3+sum(NemuresLista(2,UresLista()))
értéke (amit aztán a subst modell szerint tovább értékelünk, kifejtjük asum
függvényt).
Visszanézve az összeg típus példájára, ott a ,,ha kör, írd ki az adatait, ha háromszög, akkor is'' match kifejezés is ilyen mintákból építkezett.
Vagy nézzük ezt a kicsit bonyolultabb kódot:
1 2 3 4 5 6 7 8 9 |
|
Még néhány minta-formátum:
- A
_
(underscore) minta mindenre illeszkedik (ugyanúgy, mint egy azonosító), de nem bindeli az értéket változóhoz. Ezt praktice akkor használjuk, ha a jobb oldali kifejezésben az itt szereplő értéket nem használnánk semmire. - Ha az eddigi minták után kettősponttal teszünk egy típust, tehát
P:T
formátumú lesz a mintánk, aholT
egy típus, akkor ez akkor illeszkedik, haP
illeszkedik és az érték (futásidejű) típusaT
- Ha a mintánk után (lehet benne típusmegjelölés is) egy
if B
alakú ún. if guardot teszünk, aholB
egyBoolean
típusú kifejezés, akkor ez a minta akkor illeszkedik, ha maga a minta illeszkedik ésB
értéke igaz.
Kérdések, feladatok¶
- Gondoljuk végig, hogy a következő két mintaillesztő kód miért is azt valósítja meg, amit állítunk róla!
1 2 3 4 5 6 7 8 9 10
def length(list: Lista): Int = list match { //visszaadja a list elemszámát case UresLista() => 0 case NemuresLista(_, tail) => 1 + length(tail) } def countOdd(list: Lista) : Int = list match { //visszaadja a páratlan elemek számát case UresLista() => 0 case NemuresLista(h, t) if ( h%2 == 0 ) => countOdd(t) case NemuresLista(_, t) => 1 + countOdd(t) }
- Írjuk meg a fenti mintaillesztős függvényeket tail rekurzívan.
Utolsó frissítés: 2021-02-07 23:06:47