Для развития лифта мне иногда нужно использовать match
- case
заявления, подобные следующим. (Переписано на простой scala для более легкого понимания.) Одно примечание к ним: на самом деле это разные частичные функции, определенные в разных частях кода, поэтому важно, чтобы оператор case терпел неудачу в или перед охраной, чтобы иметь другой частичный (если совпадение не выполняется, то есть).Сфера действия переменных в отчете о защите корпуса 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
}
Теперь для того, чтобы знать, что case
заявление успешно, я должен запросить базу данных с findInDb
и проверить, является ли результат справедлив. Впоследствии я должен снова позвонить ему, чтобы использовать значение.
Делать что-то вроде
case [email protected](path, 3) if {val res = findInDb(r); res.isDefined} =>
не работает, поскольку объем res
затем ограничивается внутри фигурных скобок.
Я могу, конечно, определить var res = _
снаружи и назначить ему, но я не чувствую себя хорошо, делая это.
Можно ли каким-либо образом объявить переменную внутри охранника? Если можно сделать case [email protected](…)
, почему бы не case [email protected]() if [email protected](r.isDefined)
?
Я не совсем понимаю ваш ответ. Поскольку я написал (или, по крайней мере, надеялся, что люди поверят, что я на самом деле пробовал это), я попытался использовать 'if res @ (что-то)', и это недопустимый синтаксис. – Debilski