He visto muchos ejemplos de ARM (gestión automática de recursos) en la web para Scala. Parece ser un rito de iniciación escribir uno, aunque la mayoría se parecen mucho entre sí. Sin embargo, vi un ejemplo bastante bueno usando continuaciones.
En cualquier caso, gran parte de ese código tiene defectos de un tipo u otro, así que pensé que sería una buena idea tener una referencia aquí en Stack Overflow, donde podemos votar las versiones más correctas y apropiadas.
scala
resource-management
Daniel C. Sobral
fuente
fuente
Respuestas:
Por ahora, Scala 2.13 finalmente es compatible:
try with resources
mediante el uso de :), Ejemplo:o usando
Using.resource
evitarTry
Puede encontrar más ejemplos en Using doc.
fuente
Using.resource
variante también?using
método similar :def using[A <: AutoCloseable, B](resource: A) (block: A => B): B = try block(resource) finally resource.close()
La entrada del blog de Chris Hansen 'Bloques ARM en Scala: Revisited' del 26/03/09 habla sobre la diapositiva 21 de la presentación FOSDEM de Martin Odersky . El siguiente bloque se tomó directamente de la diapositiva 21 (con permiso):
- fin de cotización--
Entonces podemos llamar así:
¿Cuáles son los inconvenientes de este enfoque? Ese patrón parecería abordar el 95% de los lugares donde necesitaría la administración automática de recursos ...
Editar: fragmento de código agregado
Edit2: extendiendo el patrón de diseño, inspirándose en la
with
declaración de Python y abordando:Managed
claseEsto es con Scala 2.8.
fuente
Daniel
Recientemente implementé la biblioteca scala-arm para la administración automática de recursos. Puede encontrar la documentación aquí: https://github.com/jsuereth/scala-arm/wiki
Esta biblioteca admite tres estilos de uso (actualmente):
1) Imperativo / para-expresión:
2) estilo monádico
3) Estilo de Continuaciones Delimitadas
Aquí hay un servidor tcp "echo":
El código utiliza un rasgo de tipo de recurso, por lo que puede adaptarse a la mayoría de los tipos de recursos. Tiene una alternativa para usar tipificación estructural contra clases con un método close o dispose. Consulte la documentación y avíseme si piensa en alguna función útil para agregar.
fuente
Aquí está la solución de James Iry usando continuaciones:
Aquí están las soluciones con y sin continuaciones para comparar:
Y aquí está la sugerencia de mejora de Tiark Rompf:
fuente
BufferedWriter
no lanza excepciones comprobadas, por lo que si se lanza alguna excepción, no se espera que el programa se recupere de ella.Veo una evolución gradual de 4 pasos para hacer ARM en Scala:
fuente
Hay ARM de peso ligero (10 líneas de código) incluido con better-files. Ver: https://github.com/pathikrit/better-files#lightweight-arm
Así es como se implementa si no desea toda la biblioteca:
fuente
map
yflatMap
para CloseableOps en lugar de foreach para que las comprensiones no produjeran un transitable.¿Qué hay de usar clases de tipo?
fuente
Otra alternativa es la mónada Lazy TryClose de Choppy. Es bastante bueno con conexiones a bases de datos:
Y con arroyos:
Más información aquí: https://github.com/choppythelumberjack/tryclose
fuente
Aquí está la respuesta de @ chengpohi, modificada para que funcione con Scala 2.8+, en lugar de solo Scala 2.13 (sí, también funciona con Scala 2.13):
fuente