Scala não possui break
ou continue
, portanto, alguns comportamentos de loop exigem um pouco mais de reflexão.
O encerramento antecipado de um loop requer recursão final , exceções ou scala.util.control.Breaks
(que usa exceções).
A lógica para isso é que, assim goto
, são construções de fluxo que obscurecem o fluxo e podem ser realizadas de maneiras melhores e menos surpreendentes.
Mas parece que esses mesmos argumentos poderiam ser usados return
.
Por que Scala deliberadamente omitiu break
e continue
, mas não return
?
language-design
scala
control-structures
Paul Draper
fonte
fonte
break
econtinue
preciso de algumas máquinas de limpeza adicionais. OTOHreturn
é uma maneira de finalizar ordenadamente uma função e qualquer máquina de limpeza já está lá de qualquer maneira.breakable { for { break; } }
apenas uma reflexão tardia, e provavelmente longe de ser eficiente.break
econtinue
está contida na sua pergunta e no link da sua pergunta. A perguntareturn
é exatamente sobre o que eu vinculei e foi respondida, pelo menos na resposta mais votada e aceita. Se as duas respostas juntas não responderem à sua pergunta, talvez você possa editá-la para esclarecê-la.Respostas:
Quebrar e continuar:
Em uma palestra sobre Scala , Martin Odersky deu três razões para não incluir uma pausa ou continuar no slide 22:
E ele então diz: "Nós podemos apoiá-los exclusivamente nas bibliotecas". No slide 23, ele fornece o código que implementa
break
. Embora eu não conheça bem o Scala o suficiente para ter certeza, parece que o pequeno trecho desse slide é tudo o que é necessário para implementarbreak
e quecontinue
pode ser implementado em código igualmente curto.Ser capaz de implementar coisas como essas em bibliotecas simplifica a linguagem principal.
Em 'Programming in Scala, Second Edition', de Martin Odersky, Lex Spoon e Bill Venners, a seguinte explicação é dada:
Retorna:
Retornos podem ser considerados um pouco imperativos em estilo, já que retorno é um verbo, um comando para fazer alguma coisa. Mas eles também podem ser vistos de uma maneira puramente funcional / declarativa: eles definem qual é o valor de retorno da função (mesmo que, em uma função com retornos múltiplos, apenas cada um dê uma definição parcial).
No mesmo livro, eles dizem o seguinte sobre
return
:Os métodos finalizam e retornam um valor, mesmo que uma
return
instrução não seja usada, para que não haja problemas com os fechamentos, pois, caso contrário, os fechamentos não funcionariam.Também não pode haver problema em mesclar bem com literais de função, pois a função precisa retornar um valor de qualquer maneira.
fonte
Penso que as respostas anteriores justificam os problemas de definir semântica para
break
oucontinue
de uma maneira em todo o idioma para Scala, com contextos relativamente irrestritos.Escrevi uma pequena biblioteca que define
break
econtinue
em um contexto mais restrito: iteração sobre seqüências via Scala para compreensão. Ao focar nesse contexto, acredito que a semântica se torna inequívoca e fácil de raciocinar.A biblioteca está disponível aqui: https://github.com/erikerlandson/breakable
Aqui está um exemplo simples de como ele se parece no código:
fonte