Per lo sviluppo degli ascensori, a volte ho bisogno di utilizzare le affermazioni match
- case
come le seguenti. (Riscritto a scala semplice per facilitare la comprensione.) Una nota per loro: Queste sono in realtà diverse funzioni parziali, definite in diverse parti del codice, quindi è importante che una dichiarazione del caso fallisca nella o prima della guardia per avere l'altra parziale funzioni valutate (se la corrispondenza fallisce, cioè).Ambito delle variabili all'interno della guardia di scala dello statement
// The incoming request
case class Req(path: List[String], requestType: Int)
// Does some heavy database action (not shown here)
def findInDb(req: Req):Option[Int] =
if(req.path.length > 3) Some(2) else None
Req("a"::"b"::Nil, 3) match {
case [email protected](`path` :: _ :: Nil, 3) if findInDb(r).isDefined =>
doSomethingWith(findInDb(r))
case [email protected](`path` :: _ :: Nil, _) => doDefault
case _ => doNothing
}
Ora, al fine di sapere che la dichiarazione case
riesce, devo interrogare il database con findInDb
e controllare se il risultato è valido. Successivamente, devo chiamarlo di nuovo per usare il valore.
fare qualcosa di simile
case [email protected](path, 3) if {val res = findInDb(r); res.isDefined} =>
non funziona perché la portata della res
è quindi limitato a all'interno delle parentesi graffe.
Posso ovviamente definire un var res = _
esterno e assegnarlo ad esso, ma non mi sento bene a farlo.
E 'possibile dichiarare una variabile all'interno della guardia? Se è possibile fare case [email protected](…)
perché non case [email protected]() if [email protected](r.isDefined)
?
io non capisco la vostra risposta. Come ho scritto (o almeno speravo che la gente credesse che l'ho provato), ho provato a usare "if res @ (something)" e non è una sintassi valida. – Debilski