Anda memiliki tiga (atau lebih) opsi untuk keluar dari loop.
Misalkan Anda ingin menjumlahkan angka sampai total lebih besar dari 1000. Anda mencoba
var sum = 0
for (i <- 0 to 1000) sum += i
kecuali Anda ingin berhenti kapan (jumlah> 1000).
Apa yang harus dilakukan? Ada beberapa opsi.
(1a) Gunakan beberapa konstruk yang mencakup persyaratan yang Anda uji.
var sum = 0
(0 to 1000).iterator.takeWhile(_ => sum < 1000).foreach(i => sum+=i)
(peringatan - ini tergantung pada detail bagaimana tes takeWhile dan foreach disisipkan selama evaluasi, dan mungkin tidak boleh digunakan dalam praktik!).
(1b) Gunakan rekursi ekor sebagai ganti for loop, manfaatkan betapa mudahnya menulis metode baru dalam Scala:
var sum = 0
def addTo(i: Int, max: Int) {
sum += i; if (sum < max) addTo(i+1,max)
}
addTo(0,1000)
(1c) Kembali menggunakan loop sementara
var sum = 0
var i = 0
while (i <= 1000 && sum <= 1000) { sum += 1; i += 1 }
(2) Melempar pengecualian.
object AllDone extends Exception { }
var sum = 0
try {
for (i <- 0 to 1000) { sum += i; if (sum>=1000) throw AllDone }
} catch {
case AllDone =>
}
(2a) Dalam Scala 2.8+ ini sudah dipaket sebelumnya scala.util.control.Breaks
menggunakan sintaks yang sangat mirip dengan istirahat lama Anda yang akrab dari C / Java:
import scala.util.control.Breaks._
var sum = 0
breakable { for (i <- 0 to 1000) {
sum += i
if (sum >= 1000) break
} }
(3) Masukkan kode ke dalam metode dan gunakan kembali.
var sum = 0
def findSum { for (i <- 0 to 1000) { sum += i; if (sum>=1000) return } }
findSum
Ini sengaja dibuat tidak terlalu mudah untuk setidaknya tiga alasan yang bisa saya pikirkan. Pertama, dalam blok kode besar, mudah untuk mengabaikan pernyataan "lanjutkan" dan "hancurkan", atau untuk berpikir Anda keluar lebih atau kurang dari yang sebenarnya, atau perlu mematahkan dua loop yang tidak dapat Anda lakukan tetap mudah - sehingga penggunaan standar, meskipun praktis, memiliki masalah, dan karenanya Anda harus mencoba menyusun kode dengan cara yang berbeda. Kedua, Scala memiliki semua jenis sarang yang mungkin tidak Anda sadari, jadi jika Anda bisa keluar dari masalah, Anda mungkin akan terkejut dengan di mana aliran kode berakhir (terutama dengan penutupan). Ketiga, sebagian besar "loop" Scala sebenarnya bukan loop normal - mereka adalah panggilan metode yang memiliki loop sendiri,Seperti lingkaran, sulit untuk menghasilkan cara yang konsisten untuk mengetahui apa yang harus "istirahat" dan sejenisnya. Jadi, agar konsisten, hal yang bijaksana untuk dilakukan adalah tidak memiliki "istirahat" sama sekali.
Catatan : Ada persamaan fungsional semua ini di mana Anda mengembalikan nilai sum
alih - alih memutasikannya. Ini adalah Scala yang lebih idiomatis. Namun, logikanya tetap sama. ( return
menjadi return x
, dll.).