Es würde die Komplexität des Compilers (und der Sprache) erhöhen. Es ist einfach irre, Typ-Inferenz auf so etwas zu machen. Wie bei allen ähnlichen Inferenztypen funktioniert alles besser, wenn Sie einen einzelnen Ausdruck haben. Gestreute Rücksendeanweisungen erzeugen effektiv eine Menge impliziter Verzweigungen, die zur Vereinheitlichung sehr klebrig werden. Es ist nicht besonders hart, nur klebrig. Zum Beispiel:
Was, frage ich Sie, schließt der Compiler hier? Wenn der Compiler Inferenz mit expliziten Return-Anweisungen ausführt, müsste es Any
sein. Tatsächlich würden viele Methoden mit expliziten Return-Anweisungen Any
zurückgeben, selbst wenn Sie nicht heimlich mit nicht-lokalen Returns kommen. Wie ich schon sagte, klebrig.
Und obendrein, ist dies nicht eine Sprache-Funktion, die gefördert werden soll. Explizite Returns tun nicht Code Klarheit zu verbessern, es sei denn es gibt nur eine explizite Rückgabe und das am Ende der Funktion. Der Grund ist ziemlich einfach zu sehen, wenn Sie Code-Pfade als gerichtetes Diagramm anzeigen. Wie ich bereits sagte, erzeugen gestreute Renditen eine Menge impliziter Verzweigungen, die seltsame Blätter in Ihrem Graphen erzeugen, sowie eine Menge zusätzlicher Pfade im Hauptteil. Es ist einfach irre. Kontrollfluss ist viel einfacher zu sehen, wenn Ihre Zweige alle explizit sind (Mustervergleich oder if
Ausdrücke) und Ihr Code wird viel funktionaler sein, wenn Sie sich nicht auf seitenwirksame return
-Anweisungen verlassen, um Werte zu erzeugen.
So, wie einige andere „entmutigt“ -Funktionen in Scala (z asInstanceOf
statt as
), machten die Designer der Sprache eine bewusste Wahl Dinge weniger angenehm zu machen. Dies kombiniert mit der Komplexität, die es in die Typinferenz einführt, und der praktischen Nutzlosigkeit der Ergebnisse in allen außer den am meisten konstruierten Szenarien. Es macht einfach keinen Sinn für Scalac, diese Art von Schlussfolgerung zu versuchen.
Moral der Geschichte: Lernen nicht Ihre Rendite zu zerstreuen! Das ist ein guter Rat in jeder Sprache, nicht nur in Scala.
Hallo Daniel. Ich verstehe deine Erklärung nicht. Scala muss aufgrund von if/else-Anweisungen bereits mehrere Ausdrücke und Exit-Punkte in Funktionen kombinieren. Und die Scala-Sprache hat Tonnen von boshaft komplexen Dingen, die IMO die meisten Scala-Programmierer nicht sehr gut verstehen oder verwenden (z. B. Kovarianz/Kontravarianz, Strukturtypen usw.). Dies fügt dem Compiler eine Menge Komplexität hinzu; so "macht den Compiler komplexer" scheint eine schwache Antwort. –
@UrbanVagabond Sie haben den Teil "Gewinne als Kopf" verpasst. Nur weil etwas komplex ist, bedeutet es nicht, dass es sich lohnt, mehr Komplexität hinzuzufügen. Jetzt muss Scala nicht mehrere Ausdrücke und Exit-Punkte in if/else-Anweisungen kombinieren, denn wenn/else ein Ausdruck ist, keine Anweisungen. Das mag wie Haare spalten scheinen, aber der Unterschied ist sehr real. –