04 - false and loop¶
Láttuk, hogy függvényeket a def
kulcsszóval vezetünk be, nézzünk erre pár példát.
Az előadás alapján egy függvényt, ami összead két intet, így írnánk meg:
1 2 3 |
|
Ezzel kapcsolatban amit érdemes észben tartanunk:
- Ha a függvénytörzsben lévő kifejezés típusát ki tudja következtetni a Scala és az nekünk megfelel, nem kell kiírnunk a függvény visszatérési értékét.
- Ha a függvénytörzsben egyetlen kifejezés szerepel, akkor nem kell kitegyük a kapcsos zárójeleket.
- Ha a függvény nem vár egyetlen argumentumot sem, akkor nem kell kitegyük a
()
jelet a függvény neve mögé (és ekkor meghívni is enélkül tudjuk.)
Próbáljuk is ki:
1 2 3 |
|
osszeAd
függvény kimeneti típusát tehát a fordító Int
re inferreli nekünk, ezt az idea szürkével jelzi is:
Tipikusan a rekurzív függvények azok, melyeknek a Scala nem fog tudni automatikusan típust inferrelni.
A paraméter nélküli függvényekkel kapcsolatban a Scala style guide (note: érdemes nézegetni a Scala coding konvenciókat ezen az oldalon, sokkal olvashatóbb kódot tud írni az ember, ha betartja azokat az ajánlásokat, melyeket többé-kevésbé mindenki betart, és Scalában a kód jó olvashatósága must have) azt írja, hogy
- ha a metódus, melynek nincs paramétere, nem rendelkezik mellékhatással és tényleg csak egy értéket ad vissza, akkor hagyjuk el a nyitó-csukójeleket,
- de ha van mellékhatása (pl a
println()
ilyen: visszaadja a()
értéket, ami az egyetlen Unit típusú érték, de közben üt egy újsort a konzolra ,,mellékhatásként''), akkor tegyük ki a zárójeleket!
Kérdések, feladatok¶
Írjunk egy loop
függvényt, ami típusát tekintve Boolean
t ad vissza, de mindig végtelen ciklusba esik.
válasz mutatása
1 |
|
Írjunk egy and
függvényt, ami két Boolean kifejezést vár, és pontosan akkor ad vissza true
t, ha mindkettő értéke true
.
Legyen gyorsított kiértékelés: ha az első argumentum értéke false
, akkor a másodikat ki se értékelje.
1 |
|
válasz mutatása
Az előző kérdés minta megoldásának miért lehet a második paraméter típusa olyan, amilyen?
válasz mutatása
Tudsz olyan hívást mondani, ahol az and
függvény másképp viselkedik, ha call-by-name vagy call-by-value kezeljük a paramétereket?
válasz mutatása
`and(false,loop)` például végtelen ciklusba esik, ha érték szerint adjuk át a második paramétert. Ha név szerint, akkor nem: működik a gyorsított kiértékelés a call-by-name konvenció miatt.Implementáld le az or
, not
, implies
, iff
, xor
logikai műveleteket is, ott használva gyorsított kiértékelést, ahol csak lehet.
1 2 3 4 5 6 7 8 9 |
|