Hat Scala eine Entsprechung zu Gollangs Defer?

8

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.

    
Ryan The Leach 17.09.2013, 08:45
quelle

3 Antworten

7

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.

    
nemo 17.09.2013, 21:22
quelle
4

Ich kann mir keinen Scala-spezifischen Weg vorstellen, aber wäre das nicht äquivalent (wenn auch nicht so schön):

%Vor%     
fresskoma 17.09.2013 08:50
quelle
2

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

ermöglichen
  • Definieren Sie Ihren eigenen Fehlerbehandlungsablauf
  • Definierte Flüsse funktional manipulieren
  • Machen Sie die erwarteten Fehler einer Funktion zu einem Teil ihrer Signatur

defer hat keinen Platz in diesem.

    
itsbruce 17.09.2013 08:59
quelle

Tags und Links