Bạn có ba tùy chọn (hoặc hơn) để thoát ra khỏi các vòng lặp.
Giả sử bạn muốn tính tổng số cho đến khi tổng lớn hơn 1000. Bạn thử
var sum = 0
for (i <- 0 to 1000) sum += i
ngoại trừ bạn muốn dừng khi (tổng> 1000).
Phải làm sao? Có một số lựa chọn.
(1a) Sử dụng một số cấu trúc bao gồm một điều kiện mà bạn kiểm tra.
var sum = 0
(0 to 1000).iterator.takeWhile(_ => sum < 1000).foreach(i => sum+=i)
(cảnh báo - điều này phụ thuộc vào chi tiết về cách kiểm tra TakeWhile và foreach được xen kẽ trong quá trình đánh giá và có lẽ không nên được sử dụng trong thực tế!).
(1b) Sử dụng đệ quy đuôi thay vì vòng lặp for, tận dụng việc viết phương thức mới trong Scala dễ dàng như thế nào:
var sum = 0
def addTo(i: Int, max: Int) {
sum += i; if (sum < max) addTo(i+1,max)
}
addTo(0,1000)
(1c) Quay trở lại sử dụng vòng lặp while
var sum = 0
var i = 0
while (i <= 1000 && sum <= 1000) { sum += 1; i += 1 }
(2) Ném một ngoại lệ.
object AllDone extends Exception { }
var sum = 0
try {
for (i <- 0 to 1000) { sum += i; if (sum>=1000) throw AllDone }
} catch {
case AllDone =>
}
(2a) Trong Scala 2.8+, phần này đã được đóng gói sẵn scala.util.control.Breaks
bằng cách sử dụng cú pháp trông rất giống với dấu ngắt cũ quen thuộc của bạn từ C / Java:
import scala.util.control.Breaks._
var sum = 0
breakable { for (i <- 0 to 1000) {
sum += i
if (sum >= 1000) break
} }
(3) Đặt mã vào một phương thức và sử dụng trả về.
var sum = 0
def findSum { for (i <- 0 to 1000) { sum += i; if (sum>=1000) return } }
findSum
Điều này được cố ý thực hiện không quá dễ dàng vì ít nhất ba lý do tôi có thể nghĩ ra. Đầu tiên, trong các khối mã lớn, thật dễ dàng bỏ qua các câu lệnh "tiếp tục" và "phá vỡ" hoặc nghĩ rằng bạn đang thoát ra khỏi nhiều hơn hoặc ít hơn bạn thực sự hoặc cần phải phá vỡ hai vòng lặp mà bạn không thể làm dù sao cũng dễ dàng - vì vậy việc sử dụng tiêu chuẩn, trong khi tiện dụng, có vấn đề của nó, và do đó bạn nên cố gắng cấu trúc mã của mình theo một cách khác. Thứ hai, Scala có tất cả các loại tổ mà bạn có thể thậm chí không nhận thấy, vì vậy nếu bạn có thể thoát ra khỏi mọi thứ, có lẽ bạn sẽ ngạc nhiên về nơi dòng mã kết thúc (đặc biệt là với các lần đóng). Thứ ba, hầu hết các "vòng lặp" của Scala không thực sự là các vòng lặp thông thường - chúng là các cuộc gọi phương thức có vòng lặp riêng,giống như vòng lặp, thật khó để đưa ra một cách nhất quán để biết "phá vỡ" và những điều tương tự nên làm. Vì vậy, để nhất quán, điều khôn ngoan hơn cần làm là không có một "phá vỡ" nào cả.
Lưu ý : Có các chức năng tương đương của tất cả những điều này khi bạn trả về giá trị sum
thay vì thay đổi nó tại chỗ. Đây là nhiều Scala thành ngữ. Tuy nhiên, logic vẫn giữ nguyên. ( return
trở thành return x
, v.v.).