对于电梯开发,我有时需要使用match
-<code>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)
呢?