In Scala gibt es kein break
oder continue
, daher erfordert ein gewisses Loop-Verhalten ein wenig mehr Nachdenken.
Das vorzeitige Beenden einer Schleife erfordert eine Endrekursion, Ausnahmen oder scala.util.control.Breaks
(die Ausnahmen verwendet).
Der Grund dafür ist, goto
dass es sich um Strömungskonstrukte handelt, die die Strömung verdecken und auf bessere, weniger überraschende Weise erreicht werden können.
Aber es scheint, dass die gleichen Argumente verwendet werden könnten return
.
Warum hat Scala bewusst auf break
und verzichtet continue
, aber nicht return
?
language-design
scala
control-structures
Paul Draper
quelle
quelle
break
undcontinue
brauche zusätzliche Aufräummaschinen. OTOHreturn
ist eine Möglichkeit, eine Funktion ordnungsgemäß zu beenden, und Reinigungsmaschinen sind ohnehin bereits vorhanden.breakable { for { break; } }
nur einen nachträglichen Gedanken und wahrscheinlich alles andere als effizient.break
undcontinue
ist in Ihrer Frage und im Link in Ihrer Frage enthalten. Die Frage fürreturn
ist genau das, worum es bei der von mir verlinkten Frage ging, und wurde zumindest in der am besten bewerteten, akzeptierten Antwort beantwortet. Wenn die beiden Antworten Ihre Frage nicht beantworten, können Sie sie möglicherweise bearbeiten, um sie zu klären.Antworten:
Unterbrechen und fortfahren:
In einem Vortrag über Scala gab Martin Odersky 3 Gründe an, keine Pause einzuschließen oder auf Folie 22 fortzufahren:
Und dann sagt er: "Wir können sie rein in den Bibliotheken unterstützen." Auf Folie 23 gibt er Code an, der implementiert wird
break
. Obwohl ich Scala nicht genau genug kenne, um sicherzugehen, scheint es, dass das kurze Snippet auf dieser Folie alles ist, was zur Implementierung benötigt wirdbreak
, und dascontinue
könnte in Code implementiert werden, der ähnlich kurz ist.Solche Dinge in Bibliotheken implementieren zu können, vereinfacht die Kernsprache.
In "Programming in Scala, Second Edition" von Martin Odersky, Lex Spoon und Bill Venners wird Folgendes erklärt:
Rückkehr:
Rückgaben können als ein bisschen zwingend angesehen werden, da Rückgabe ein Verb ist, ein Befehl, etwas zu tun. Sie können aber auch rein funktional / deklarativ gesehen werden: Sie definieren den Rückgabewert der Funktion (auch wenn in einer Funktion mit mehreren Rückgaben nur jeweils eine Teildefinition angegeben wird).
Im selben Buch heißt es
return
:Methoden beenden und geben einen Wert zurück, auch wenn keine
return
Anweisung verwendet wird. Daher kann es keine Probleme mit Closures geben, da Closures andernfalls nicht funktionieren würden.Es kann auch kein Problem geben, gut mit Funktionsliteralen zu verzahnen, da die Funktion ohnehin einen Wert zurückgeben muss.
quelle
Ich denke, die vorherigen Antworten werden den Problemen gerecht, Semantik für Scala
break
odercontinue
auf eine sprachweite Weise zu definieren, mit relativ uneingeschränkten Kontexten.Ich habe eine kleine Bibliothek geschrieben , die definiert
break
undcontinue
in einem engeren Kontext: Iteration über Sequenzen mittels Scala für das Verständnis. Wenn ich mich auf diesen Kontext konzentriere, glaube ich, dass die Semantik eindeutig und leicht zu erklären ist.Die Bibliothek ist hier verfügbar: https://github.com/erikerlandson/breakable
Hier ist ein einfaches Beispiel, wie es im Code aussieht:
quelle