In Scala il "ciclo" for
non è in realtà un costrutto linguaggio speciale, ma piuttosto zucchero sintattico. Il tuo primo esempio
val q2 = for {
c <- Coffees if c.price < 9.0
s <- Suppliers if s.id === c.supID
} yield (c.name, s.name)
si traduce in qualcosa nelle linee di:
val q2 = Coffees.withFilter(_.price < 9.0).flatMap(c =>
Suppliers.withFilter(_.id === c.supID).map(s =>
(c.name, s.name)
)
)
Ora, il flatMap
, map
, withFilter
(e foreach
) in realtà non filtrare la raccolta, ma piuttosto di raccogliere ciò che è hapening in un AST (Abstract Syntax Tree), che viene quindi gestito da Slick per tradurre in SQL.
Inoltre, c.price
, c.supID
sono in realtà Slick column
s, cui <
, >
, ===
(e così via) metodi non restituiscono bool, ma raccolgono il confronto pure, che viene poi passato giù da convertire SQL.
This is a talk dai creatori, dove la maggior parte di questo è descritto (correttamente).
fonte
2012-12-07 07:21:49
Davvero un ottimo post. Il sollevamento implicito è abbastanza intelligente –