У вас є три (або близько того) варіанти, щоб вирватися з циклів.
Припустимо, ви хочете підсумовувати числа, поки загальна сума не перевищить 1000. Спробуйте
var sum = 0
for (i <- 0 to 1000) sum += i
за винятком того, що ви хочете зупинитися, коли (сума> 1000).
Що робити? Є кілька варіантів.
(1a) Використовуйте деяку конструкцію, яка включає умовне, яке ви тестуєте.
var sum = 0
(0 to 1000).iterator.takeWhile(_ => sum < 1000).foreach(i => sum+=i)
(попередження - це залежить від деталей того, як тест takeWhile і foreach переплітаються під час оцінювання, і, ймовірно, не повинні використовуватися на практиці!).
(1b) Використовуйте хвостову рекурсію замість петлі, скориставшись тим, як легко написати новий метод у Scala:
var sum = 0
def addTo(i: Int, max: Int) {
sum += i; if (sum < max) addTo(i+1,max)
}
addTo(0,1000)
(1c) Відмовтеся від використання циклу час
var sum = 0
var i = 0
while (i <= 1000 && sum <= 1000) { sum += 1; i += 1 }
(2) Киньте виняток.
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+ це вже попередньо упаковано з scala.util.control.Breaks
використанням синтаксису, який дуже схожий на ваш знайомий старий перерву від C / Java:
import scala.util.control.Breaks._
var sum = 0
breakable { for (i <- 0 to 1000) {
sum += i
if (sum >= 1000) break
} }
(3) Введіть код у спосіб і використовуйте return.
var sum = 0
def findSum { for (i <- 0 to 1000) { sum += i; if (sum>=1000) return } }
findSum
Це навмисно зроблено не надто просто з принаймні трьох причин, про які я можу придумати. По-перше, у великих блоках коду легко не помітити висловлювання "продовжити" та "зламати" або подумати, що ви виходите з більш-менш, ніж ви є насправді, або вам потрібно розірвати дві петлі, які ви не можете зробити все одно легко - тому стандартне використання, хоча і зручне, має свої проблеми, і тому вам слід спробувати структурувати свій код по-іншому. По-друге, у Scala є всілякі гніздування, які ви, мабуть, навіть не помічаєте, тому, якщо ви могли б вирватися з речей, ви, мабуть, здивувалися б тому, де закінчився потік коду (особливо з закриттям). По-третє, більшість "циклів" Scala насправді не є нормальними петлями - це виклики методів, які мають свою цикл,петлеподібно, важко придумати послідовний спосіб дізнатися, що "зламати" тощо. Тож, щоб бути послідовним, мудріша справа - це взагалі не робити «перерву».
Примітка . Існують функціональні еквіваленти всього цього, коли ви повертаєте значення, sum
а не мутуєте його на місці. Це більш ідіоматична Скала. Однак логіка залишається тією ж. ( return
стає return x
тощо).