Hat Scala einen gleichwertigen Effekt auf Golfer?
von: Ссылка
Go's Defer-Anweisung plant einen Funktionsaufruf (die Deferred-Funktion), der ausgeführt werden soll, unmittelbar bevor die Funktion, die die Defer-Operation ausführt, zurückkehrt. Es ist eine ungewöhnliche, aber effektive Möglichkeit, mit Situationen umzugehen, wie Ressourcen, die freigegeben werden müssen, unabhängig davon, welchen Pfad eine Funktion für die Rückgabe benötigt. Die kanonischen Beispiele sind das Entsperren eines Mutex oder das Schließen einer Datei.
Scala bietet defer
nicht standardmäßig an, Sie können es jedoch selbst erstellen, indem Sie es umbrechen
Ihre Funktion in einer anderen Funktion, indem Sie ein Objekt übergeben, das die zu rufenden Funktionen verfolgt.
Beispiel:
%Vor% In diesem Beispiel wäre Deferable
die Umbruchfunktion, die context
und aufruft
gibt den Inhalt zurück und gibt ihm ein Objekt, das defer
Aufrufe verfolgt.
Sie können dieses Konstrukt wie folgt verwenden:
%Vor%Die Ausgabe wäre:
%Vor%Ich bin mir bewusst, dass dies anders gelöst werden kann, aber es ist wirklich nur ein Beispiel dafür Scala unterstützt das Konzept der Verschiebung ohne viel Aufhebens.
Nein. Go hat dieses Konstrukt genau, weil es keine Ausnahmen unterstützt und keine try...finally
-Syntax hat.
Ich persönlich denke, dass es einen Wartungs-Alptraum einlädt; Anrufe zum Zurückstellen können überall in einer Funktion begraben werden. Selbst wenn die verantwortlichen Programmierer die Defense direkt neben die zu räumende Sache setzen, denke ich, dass es weniger klar ist als ein finally
Block und was die chaotischen Programmierer machen ... zumindest finally
Blöcke setzen alles rein an einem Ort.
defer
ist das Gegenteil von idiomatischem Scala. Scala bietet monadische Möglichkeiten, den Programmfluss zu kontrollieren und defer
magic trägt überhaupt nicht dazu bei. Monaden bieten eine funktionale Verbesserung gegenüber try...finally
, die Sie
defer
hat keinen Platz in diesem.