Scala n'a pas break
ou continue
, donc certains comportements de boucle demandent un peu plus de réflexion.
La fin précoce d' une boucle nécessite une récursivité de queue, des exceptions ou scala.util.control.Breaks
(qui utilise des exceptions).
La raison en est que, comme goto
, ce sont des constructions de flux qui obscurcissent le flux, et peuvent être accomplies de manière meilleure et moins surprenante.
Mais il semble que ces mêmes arguments pourraient être utilisés return
.
Pourquoi Scala a-t-il délibérément omis break
et continue
, mais pas return
?
language-design
scala
control-structures
Paul Draper
la source
la source
break
et j'aicontinue
besoin de machines de nettoyage supplémentaires. OTOHreturn
est un moyen de terminer une fonction de manière ordonnée, et toute machine de nettoyage est déjà là de toute façon.breakable { for { break; } }
qu'une réflexion après coup, et probablement loin d'être efficace.break
etcontinue
est contenue dans votre question et dans le lien dans votre question. La question de savoirreturn
exactement sur quoi portait la question que j'ai liée et à laquelle on a répondu, du moins dans la réponse acceptée la plus votée. Si les deux réponses réunies ne répondent pas à votre question, vous pouvez peut-être modifier la question pour la clarifier.Réponses:
Break and Continue:
Dans une conférence sur Scala , Martin Odersky a donné 3 raisons de ne pas inclure la pause ou de continuer sur la diapositive 22:
Et il dit ensuite: "Nous pouvons les prendre en charge uniquement dans les bibliothèques." Sur la diapositive 23, il donne le code qui implémente
break
. Bien que je ne connaisse pas assez bien Scala pour en être certain, il semble que l'extrait court sur cette diapositive soit tout ce qu'il faut pour implémenterbreak
, et celacontinue
pourrait être implémenté dans un code qui est tout aussi court.Être capable d'implémenter des trucs comme ça dans les bibliothèques simplifie le langage principal.
Dans 'Programming in Scala, Second Edition', de Martin Odersky, Lex Spoon et Bill Venners, l'explication suivante est donnée:
Revenir:
Les retours peuvent être considérés comme un peu impératifs dans le style, car return est un verbe, une commande pour faire quelque chose. Mais ils peuvent également être vus d'une manière purement fonctionnelle / déclarative: ils définissent quelle est la valeur de retour de la fonction (même si, dans une fonction à plusieurs retours, ils ne donnent chacun qu'une définition partielle).
Dans le même livre, ils disent ce qui suit à propos de
return
:Les méthodes terminent et renvoient une valeur, même si une
return
instruction n'est pas utilisée, donc il ne peut y avoir de problème avec les fermetures, car sinon les fermetures ne fonctionneraient pas.Il ne peut pas non plus y avoir de problème de bon maillage avec les littéraux de fonction, car la fonction doit quand même retourner une valeur.
la source
Je pense que les réponses précédentes rendent justice aux problèmes de définition de la sémantique pour
break
oucontinue
de manière linguistique pour Scala, avec des contextes relativement sans contraintes.J'ai écrit une petite bibliothèque qui définit
break
etcontinue
dans un contexte plus contraint: itération sur des séquences via Scala for-comprehensions. En me concentrant sur ce contexte, je crois que la sémantique devient sans ambiguïté et facile à raisonner.La bibliothèque est disponible ici: https://github.com/erikerlandson/breakable
Voici un exemple simple de ce à quoi il ressemble dans le code:
la source