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