W Scala „pętla” for
nie jest rzeczywiście szczególna konstrukcja języka, ale raczej cukier syntaktyczny. Pierwszym przykładem
val q2 = for {
c <- Coffees if c.price < 9.0
s <- Suppliers if s.id === c.supID
} yield (c.name, s.name)
przekłada się na coś w linii:
val q2 = Coffees.withFilter(_.price < 9.0).flatMap(c =>
Suppliers.withFilter(_.id === c.supID).map(s =>
(c.name, s.name)
)
)
Teraz flatMap
, map
, withFilter
(i foreach
) w rzeczywistości nie filtrować kolekcję, ale raczej zebrać co hapening w AST (drzewo składni abstrakcyjnej), które następnie jest obsługiwane przez Slick w celu przetłumaczenia na język SQL.
Również c.price
, c.supID
faktycznie Slick column
s, których <
, >
, ===
(i tak dalej), metodami nie wraca bool, ale zbierania porównania, jak również, co jest następnie przekazywana do konwersji do SQL.
This is a talk przez twórców, gdzie większość z nich jest opisana (poprawnie).
Naprawdę świetny post. Niejawne podnoszenie jest dość sprytne –