Você tem três (mais ou menos) opções para interromper os loops.
Suponha que você queira somar números até que o total seja maior que 1000. Você tenta
var sum = 0
for (i <- 0 to 1000) sum += i
exceto que você deseja parar quando (soma> 1000).
O que fazer? Existem várias opções.
(1a) Use alguma construção que inclua uma condição que você teste.
var sum = 0
(0 to 1000).iterator.takeWhile(_ => sum < 1000).foreach(i => sum+=i)
(aviso - isso depende dos detalhes de como o teste takeWhile e o foreach são intercalados durante a avaliação e provavelmente não devem ser usados na prática!).
(1b) Use recursão de cauda em vez de um loop for, aproveitando a facilidade de escrever um novo método no Scala:
var sum = 0
def addTo(i: Int, max: Int) {
sum += i; if (sum < max) addTo(i+1,max)
}
addTo(0,1000)
(1c) Volte a usar um loop while
var sum = 0
var i = 0
while (i <= 1000 && sum <= 1000) { sum += 1; i += 1 }
(2) Lance uma exceção.
object AllDone extends Exception { }
var sum = 0
try {
for (i <- 0 to 1000) { sum += i; if (sum>=1000) throw AllDone }
} catch {
case AllDone =>
}
(2a) No Scala 2.8+, isso já está pré-empacotado no scala.util.control.Breaks
uso de sintaxe que se parece muito com a sua antiga quebra familiar do C / Java:
import scala.util.control.Breaks._
var sum = 0
breakable { for (i <- 0 to 1000) {
sum += i
if (sum >= 1000) break
} }
(3) Coloque o código em um método e use return.
var sum = 0
def findSum { for (i <- 0 to 1000) { sum += i; if (sum>=1000) return } }
findSum
Isso é intencionalmente tornado não muito fácil por pelo menos três razões em que consigo pensar. Primeiro, em grandes blocos de código, é fácil ignorar as instruções "continue" e "break", ou pensar que você está quebrando mais ou menos do que realmente é, ou precisar interromper dois loops que você não pode executar de qualquer maneira facilmente - portanto, o uso padrão, embora útil, tem seus problemas e, portanto, você deve tentar estruturar seu código de maneira diferente. Segundo, Scala tem todos os tipos de aninhamentos que você provavelmente nem percebe; portanto, se você pudesse se libertar, provavelmente ficaria surpreso com a localização do fluxo do código (principalmente nos fechamentos). Terceiro, a maioria dos "loops" de Scala não são realmente loops normais - são chamadas de método que têm seu próprio loop,de maneira irregular, é difícil encontrar uma maneira consistente de saber o que "quebra" e coisas semelhantes devem fazer. Portanto, para ser consistente, a coisa mais sábia a fazer é não ter uma "pausa".
Nota : Existem equivalentes funcionais de todos eles em que você retorna o valor, em sum
vez de modificá-lo no lugar. Estes são Scala mais idiomáticos. No entanto, a lógica permanece a mesma. ( return
torna-se return x
, etc.).