Döngülerden kurtulmak için üç seçeneğiniz vardır.
Toplam 1000'den büyük olana kadar sayıları toplamak istediğinizi varsayalım.
var sum = 0
for (i <- 0 to 1000) sum += i
dışında durmak istediğinizde (toplam> 1000).
Ne yapalım? Birkaç seçenek var.
(1a) Test ettiğiniz bir koşul içeren bir yapı kullanın.
var sum = 0
(0 to 1000).iterator.takeWhile(_ => sum < 1000).foreach(i => sum+=i)
(uyarı - bu, takeWhile testinin ve foreach'in değerlendirme sırasında nasıl serpiştirildiğine ve muhtemelen pratikte kullanılmaması gerektiğine dair ayrıntılara bağlıdır!).
(1b) Scala'da yeni bir yöntem yazmanın ne kadar kolay olduğundan yararlanarak, for döngüsü yerine kuyruk özyineleme kullanın:
var sum = 0
def addTo(i: Int, max: Int) {
sum += i; if (sum < max) addTo(i+1,max)
}
addTo(0,1000)
(1c) while döngüsü kullanmaya geri dön
var sum = 0
var i = 0
while (i <= 1000 && sum <= 1000) { sum += 1; i += 1 }
(2) Bir istisna atın.
object AllDone extends Exception { }
var sum = 0
try {
for (i <- 0 to 1000) { sum += i; if (sum>=1000) throw AllDone }
} catch {
case AllDone =>
}
(2a) Scala 2.8+ sürümünde bu zaten scala.util.control.Breaks
C / Java'dan tanıdık eski kopuşunuza benzeyen sözdizimi kullanılarak önceden paketlenmiştir :
import scala.util.control.Breaks._
var sum = 0
breakable { for (i <- 0 to 1000) {
sum += i
if (sum >= 1000) break
} }
(3) Kodu bir yönteme ekleyin ve return kullanın.
var sum = 0
def findSum { for (i <- 0 to 1000) { sum += i; if (sum>=1000) return } }
findSum
Bu, düşünebildiğim en az üç nedenden ötürü kasıtlı olarak çok kolay değil. Birincisi, büyük kod bloklarında, "devam" ve "kır" ifadelerini göz ardı etmek veya gerçekte olduğundan daha fazla veya daha az koptuğunuzu düşünmek veya yapamayacağınız iki döngüyü kırmak kolaydır kolayca - standart kullanım, kullanışlı olsa da, sorunları vardır ve bu nedenle kodunuzu farklı bir şekilde yapılandırmaya çalışmalısınız. İkincisi, Scala muhtemelen farkına bile varmayacağınız her türlü yuvaya sahiptir, bu yüzden bir şeylerden kurtulabilirseniz, kod akışının nereye gittiğine (özellikle kapaklarla) şaşıracaksınız. Üçüncüsü, Scala'nın "döngülerinin" çoğu aslında normal döngüler değildir - kendi döngüleri olan yöntem çağrılarıdır,looplike, "mola" ve benzerlerinin ne yapması gerektiğini bilmek için tutarlı bir yol bulmak zor. Dolayısıyla, tutarlı olmak için yapılacak en akıllıca şey hiç bir "mola" vermemek.
Not : Bunların sum
yerine mutasyon yapmak yerine değerini döndürdüğünüz tüm bunların işlevsel eşdeğerleri vardır . Bunlar daha deyimsel Scala. Ancak, mantık aynı kalır. ( return
olur return x
vb.).