Để phát triển thang máy, đôi khi tôi cần sử dụng các câu lệnh match
- case
như sau. Một lưu ý cho họ: Đây thực sự là một phần chức năng khác nhau, được định nghĩa trong các phần khác nhau của mã, vì vậy điều quan trọng là một tuyên bố trường hợp không thành công trong hoặc trước bảo vệ để có phần khác các hàm được đánh giá (nếu khớp không thành công, nghĩa là).Phạm vi các biến bên trong tuyên bố bảo vệ trường hợp của 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
}
Bây giờ, để biết rằng tuyên bố case
thành công, tôi phải truy vấn cơ sở dữ liệu với findInDb
và kiểm tra xem kết quả là hợp lệ. Sau đó, tôi phải gọi lại lần nữa để sử dụng giá trị.
Làm cái gì đó như
case [email protected](path, 3) if {val res = findInDb(r); res.isDefined} =>
không làm việc vì phạm vi res
sau đó được giới hạn ở bên trong dấu ngoặc.
Tôi có thể định nghĩa một bên là var res = _
bên ngoài và gán cho nó, nhưng tôi không cảm thấy khỏe khi làm điều này.
Có bằng bất kỳ phương tiện nào có thể khai báo biến trong bảo vệ không? Nếu có thể thực hiện case [email protected](…)
tại sao không phải là case [email protected]() if [email protected](r.isDefined)
?
Tôi hoàn toàn không hiểu câu trả lời của bạn. Như tôi đã viết (hoặc ít nhất là có hy vọng rằng mọi người sẽ tin rằng tôi thực sự đã thử nó), tôi đã thử sử dụng 'if res @ (something)' và nó không phải là cú pháp hợp lệ. – Debilski