J'ai vu de nombreux exemples d'ARM (gestion automatique des ressources) sur le Web pour Scala. Cela semble être un rite de passage pour en écrire un, bien que la plupart se ressemblent beaucoup. J'ai cependant vu un exemple assez cool utilisant des continuations.
En tout cas, une grande partie de ce code a des défauts d'un type ou d'un autre, alors j'ai pensé que ce serait une bonne idée d'avoir une référence ici sur Stack Overflow, où nous pouvons voter pour les versions les plus correctes et appropriées.
scala
resource-management
Daniel C. Sobral
la source
la source
Réponses:
Pour l'instant, Scala 2.13 a enfin pris en charge:
try with resources
en utilisant Using :), Exemple:ou en utilisant
Using.resource
éviterTry
Vous pouvez trouver plus d'exemples dans Utilisation de doc.
la source
Using.resource
variante?using
méthode similaire :def using[A <: AutoCloseable, B](resource: A) (block: A => B): B = try block(resource) finally resource.close()
L' entrée de blog de Chris Hansen 'ARM Blocks in Scala: Revisited' du 26/03/09 parle de la diapositive 21 de la présentation FOSDEM de Martin Odersky . Ce bloc suivant est tiré directement de la diapositive 21 (avec permission):
--end devis--
Ensuite, nous pouvons appeler comme ceci:
Quels sont les inconvénients de cette approche? Ce modèle semble répondre à 95% des cas où j'aurais besoin d'une gestion automatique des ressources ...
Edit: extrait de code ajouté
Edit2: étendre le modèle de conception - s'inspirer de la
with
déclaration et de l'adressage python :Managed
classeC'est avec Scala 2.8.
la source
Daniel,
Je viens de déployer récemment la bibliothèque scala-arm pour la gestion automatique des ressources. Vous pouvez trouver la documentation ici: https://github.com/jsuereth/scala-arm/wiki
Cette bibliothèque prend en charge trois styles d'utilisation (actuellement):
1) Impératif / pour-expression:
2) de style monadique
3) style Continuations délimitées
Voici un serveur tcp "echo":
Le code utilise un trait de type Resource, il est donc capable de s'adapter à la plupart des types de ressources. Il a une alternative pour utiliser le typage structurel contre les classes avec une méthode close ou dispose. Veuillez consulter la documentation et laissez-moi savoir si vous pensez à des fonctionnalités utiles à ajouter.
la source
Voici la solution James Iry utilisant des continuations:
Voici les solutions avec et sans suite pour comparaison:
Et voici la suggestion d'amélioration de Tiark Rompf:
la source
BufferedWriter
ne lève pas d'exceptions vérifiées, donc si une exception est levée, le programme ne devrait pas en récupérer.Je vois une évolution progressive en 4 étapes pour faire ARM dans Scala:
la source
Il y a un ARM léger (10 lignes de code) inclus avec de meilleurs fichiers. Voir: https://github.com/pathikrit/better-files#lightweight-arm
Voici comment il est implémenté si vous ne voulez pas toute la bibliothèque:
la source
map
etflatMap
pour CloseableOps au lieu de foreach afin que pour les compréhensions ne donne pas un traversable.Que diriez-vous d'utiliser les classes Type
la source
Une autre alternative est la monade Lazy TryClose de Choppy. C'est assez bon avec les connexions de base de données:
Et avec les flux:
Plus d'informations ici: https://github.com/choppythelumberjack/tryclose
la source
Voici la réponse de @ chengpohi, modifiée pour qu'elle fonctionne avec Scala 2.8+, au lieu de juste Scala 2.13 (oui, cela fonctionne aussi avec Scala 2.13):
la source