32 - collect¶
Láttuk most már a PartialFunction traitet.
Ezzel kapcsolatos a kollekciók által támogatott collect
metódus, pl. a List[T]
-belinek a szignatúrája:
1 |
|
pf
parciális függvényt azokra az elemekre, melyeken definiált, és az eredményekből épít egy listát.
Fejezzük ezt ki a már ismert kollekcióműveletekkel!
1 |
|
Válasz mutatása
partial function példányosítása¶
Természetesen lehet PartialFunction
t úgy is példányosítani, ahogy traiteket szoktunk: le lehet belőle származtatni
egy osztályt, implementálni benne ezt a két metódust. De van rá nyelvi szinten kényelmes megoldás is, mégpedig ugyanaz,
mint amit már match
kifejezések belsejében láttunk:
1 2 3 |
|
- kapcsos zárójelben, case-ek felsorolásával deklarálhatunk parciális függvényt
- ebből az
isDefinedAt(x)
metódus úgy lesz implementálva, hogy megnézi, azx
argumentumra van-e illeszkedő case; ha van, akkorisDefinedAt
true lesz, különben false (a case jobb oldalán álló kifejezést nem értékeli ekkor ki!) - az
apply(x)
pedig matchelix
-et erre a blokkra. (Ha nem illeszkedik egy case sem az inputra, azaz ha erre az inputraisDefinedAt(x)
hamis, akkorMatchError
t dob.)
Mi lesz tehát pl. List(1,4,2,8,5,7).collect( isEven )
értéke?
1 |
|
Válasz mutatása
Írjunk olyan függvényt, ami egy List[Pet]
-ből kigyűjti a listában szereplő macskák neveit!
1 2 3 4 5 6 |
|
Válasz mutatása
Láthatjuk: abból, hogy a petList
en hívjuk a collect
metódust, ebből a Scala fordító kitalálja, hogy
a PartialFunction[K,V]
-ben a K
mondjuk Pet
; a kimeneti típust pedig onnan tudja, hogy az egyetlen
esetünk bal oldalán a minta azt mondju, hogy m
egy Cat
, akkor a jobb oldalán m.name
, a macska
neve pedig String
lesz, és ezért akkor egy PartialFunction[Pet,String]
az, amit létrehozunk a collect
-ben.
A minta persze pontosan a macskákra fog illeszkedni, akiknek a neveit össze tudjuk szedni.