リフト開発ではmatch
、次のような –<code>case ステートメントを使用する必要がある場合があります。(理解しやすいように単純な scala に書き直しました。) 彼らへの 1 つの注意: これらは実際には異なる部分関数であり、コードの異なる部分で定義されているため、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)
ですか?