Para el desarrollo de la elevación, a veces necesito usar las declaraciones match
- case
como las siguientes. (Reescrito a escala simple para una comprensión más fácil.) Una nota para ellos: en realidad son funciones parciales diferentes, definidas en diferentes partes del código, por lo que es importante que una declaración de caso falle en o antes del guardia para que el otro parcial funciones evaluadas (si la coincidencia falla, eso es).Alcance de las variables dentro de la declaración de protección de la caja de scala
// 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
}
Ahora, con el fin de saber que la declaración case
tiene éxito, hay que consultar la base de datos con findInDb
y comprobar si el resultado es válido. Después, debo volver a llamar para usar el valor.
Hacer algo como
case [email protected](path, 3) if {val res = findInDb(r); res.isDefined} =>
no funciona debido a que el alcance de res
se limita entonces a dentro de las llaves.
Definitivamente puedo definir un var res = _
fuera y asignarlo, pero no me siento bien al hacerlo.
¿Es de alguna manera posible declarar una variable dentro del protector? Si es posible hacer case [email protected](…)
¿por qué no case [email protected]() if [email protected](r.isDefined)
?
yo no entiendo muy bien su respuesta. Cuando escribí (o al menos tenía la esperanza de que la gente creyera que realmente lo intenté), traté de usar 'if res @ (algo)' y no es una sintaxis válida. – Debilski