對於電梯開發,我有時需要使用match
- case
聲明如下。 (爲了便於理解,重寫爲普通的scala。)給他們一個註釋:這些實際上是不同的部分函數,它們在代碼的不同部分中定義,所以重要的是case語句在guard或guard之前失敗,以便讓其他部分函數評估(如果匹配失敗,那就是)。現在scala內部變量的範圍case case guard
// 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 @(something)',它不是有效的語法。 – Debilski 2010-08-20 16:16:01