Tenho visto muitos exemplos de ARM (gerenciamento automático de recursos) na web para Scala. Parece ser um rito de passagem escrever um, embora a maioria se pareça muito. Eu fiz ver um exemplo muito legal usando continuações, no entanto.
De qualquer forma, grande parte desse código tem falhas de um tipo ou de outro, então achei uma boa ideia ter uma referência aqui no Stack Overflow, onde podemos votar nas versões mais corretas e apropriadas.
scala
resource-management
Daniel C. Sobral
fonte
fonte
Respostas:
Por enquanto, Scala 2.13 finalmente tem suporte:
try with resources
usando Usando :), Exemplo:ou usando
Using.resource
evitarTry
Você pode encontrar mais exemplos em Usando o doc.
fonte
Using.resource
variante também?using
método semelhante :def using[A <: AutoCloseable, B](resource: A) (block: A => B): B = try block(resource) finally resource.close()
A entrada do blog de Chris Hansen 'ARM Blocks in Scala: Revisited' de 26/03/09 fala sobre o slide 21 da apresentação FOSDEM de Martin Odersky . Este próximo bloco é retirado diretamente do slide 21 (com permissão):
--enviar citação--
Então podemos chamar assim:
Quais são as desvantagens dessa abordagem? Esse padrão parece abordar 95% de onde eu precisaria de gerenciamento automático de recursos ...
Editar: snippet de código adicionado
Edit2: estendendo o padrão de design - inspirando-se na
with
instrução python e abordando:Managed
classeIsso ocorre com o Scala 2.8.
fonte
Daniel,
Recentemente, implantei a biblioteca scala-arm para gerenciamento automático de recursos. Você pode encontrar a documentação aqui: https://github.com/jsuereth/scala-arm/wiki
Esta biblioteca oferece suporte a três estilos de uso (atualmente):
1) Imperativo / para expressão:
2) Estilo monádico
3) Estilo de continuação delimitado
Aqui está um servidor tcp "echo":
O código faz uso de uma característica de tipo de recurso, portanto, é capaz de se adaptar à maioria dos tipos de recursos. Ele tem um fallback para usar tipagem estrutural em classes com um método close ou dispose. Verifique a documentação e deixe-me saber se você pensa em algum recurso útil para adicionar.
fonte
Aqui está a solução de James Iry usando continuações:
Aqui estão as soluções com e sem continuação para comparação:
E aqui está a sugestão de melhoria de Tiark Rompf:
fonte
BufferedWriter
não lança exceções verificadas, portanto, se alguma exceção for lançada, o programa não deverá se recuperar dela.Vejo uma evolução gradual de 4 etapas para fazer ARM no Scala:
fonte
Há um ARM leve (10 linhas de código) incluído com os melhores arquivos. Veja: https://github.com/pathikrit/better-files#lightweight-arm
Aqui está como ele é implementado se você não quiser a biblioteca inteira:
fonte
map
eflatMap
para CloseableOps em vez de foreach, de modo que para compreensões não resultasse um travessível.Que tal usar classes Type
fonte
Outra alternativa é a mônada Lazy TryClose de Choppy. É muito bom com conexões de banco de dados:
E com streams:
Mais informações aqui: https://github.com/choppythelumberjack/tryclose
fonte
Aqui está a resposta de @chengpohi, modificada para funcionar com Scala 2.8+, em vez de apenas Scala 2.13 (sim, também funciona com Scala 2.13):
fonte