Ich habe im Web viele Beispiele für ARM (Automatic Resource Management) für Scala gesehen. Es scheint ein Übergangsritus zu sein, einen zu schreiben, obwohl die meisten einander ziemlich ähnlich sehen. Ich habe allerdings ein ziemlich cooles Beispiel mit Fortsetzungen gesehen.
Auf jeden Fall weist ein Großteil dieses Codes Fehler des einen oder anderen Typs auf, daher hielt ich es für eine gute Idee, hier auf Stack Overflow eine Referenz zu haben, in der wir über die korrektesten und am besten geeigneten Versionen abstimmen können.
scala
resource-management
Daniel C. Sobral
quelle
quelle
Antworten:
Im Moment hat Scala 2.13 endlich unterstützt:
try with resources
mit Using :), Beispiel:oder mit
Using.resource
vermeidenTry
Weitere Beispiele finden Sie unter Verwenden von doc.
quelle
Using.resource
Variante hinzufügen ?using
Methode:def using[A <: AutoCloseable, B](resource: A) (block: A => B): B = try block(resource) finally resource.close()
Chris Hansens Blogeintrag 'ARM Blocks in Scala: Revisited' vom 26.03.09 spricht über Folie 21 von Martin Oderskys FOSDEM-Präsentation . Dieser nächste Block stammt direkt von Folie 21 (mit Genehmigung):
--end quote--
Dann können wir so nennen:
Was sind die Nachteile dieses Ansatzes? Dieses Muster scheint 95% der Probleme zu lösen, bei denen ich ein automatisches Ressourcenmanagement benötigen würde ...
Bearbeiten: Code-Snippet hinzugefügt
Edit2: Erweiterung des Designmusters - Inspiration aus der Python-
with
Anweisung und Adressierung:Managed
KlasseDies ist mit Scala 2.8.
quelle
Daniel,
Ich habe kürzlich die Scala-Arm-Bibliothek für die automatische Ressourcenverwaltung bereitgestellt. Die Dokumentation finden Sie hier: https://github.com/jsuereth/scala-arm/wiki
Diese Bibliothek unterstützt (derzeit) drei Verwendungsstile:
1) Imperativ / Ausdruck:
2) Monadischer Stil
3) Begrenzter Fortsetzungsstil
Hier ist ein "Echo" TCP-Server:
Der Code verwendet ein Ressourcentyp-Merkmal, sodass er sich an die meisten Ressourcentypen anpassen kann. Es hat einen Fallback, strukturelle Typisierung für Klassen mit einer Close- oder Dispose-Methode zu verwenden. Bitte lesen Sie die Dokumentation und lassen Sie mich wissen, wenn Sie an nützliche Funktionen denken, die Sie hinzufügen können.
quelle
Hier ist die James Iry- Lösung mit Fortsetzungen:
Hier sind die Lösungen mit und ohne Fortsetzung zum Vergleich:
Und hier ist Tiark Rompfs Verbesserungsvorschlag:
quelle
BufferedWriter
löst keine geprüften Ausnahmen aus. Wenn also eine Ausnahme ausgelöst wird, wird nicht erwartet, dass das Programm diese wiederherstellt.Ich sehe eine schrittweise 4-Stufen-Entwicklung für ARM in Scala:
quelle
In besseren Dateien ist ein leichtes ARM (10 Codezeilen) enthalten. Siehe: https://github.com/pathikrit/better-files#lightweight-arm
So wird es implementiert, wenn Sie nicht die gesamte Bibliothek möchten:
quelle
map
undflatMap
-Methode für die CloseableOps anstelle von foreach definiert, damit zum Verständnis kein Traversable erhalten wird.Wie wäre es mit Typklassen
quelle
Eine andere Alternative ist Choppys Lazy TryClose-Monade. Es ist ziemlich gut mit Datenbankverbindungen:
Und mit Streams:
Weitere Informationen hier: https://github.com/choppythelumberjack/tryclose
quelle
Hier ist die Antwort von @ chengpohi, die so geändert wurde, dass sie mit Scala 2.8+ funktioniert, anstatt nur mit Scala 2.13 (ja, sie funktioniert auch mit Scala 2.13):
quelle