Widziałem wiele przykładów ARM (automatycznego zarządzania zasobami) w Internecie dla Scala. Wydaje się, że napisanie takiego rytuału jest rytuałem przejścia, chociaż większość z nich wygląda bardzo podobnie. Widziałem jednak całkiem fajny przykład z użyciem kontynuacji.
W każdym razie, wiele z tego kodu ma wady tego czy innego typu, więc pomyślałem, że dobrym pomysłem byłoby umieszczenie tutaj odniesienia do Stack Overflow, gdzie możemy głosować na najbardziej poprawne i odpowiednie wersje.
scala
resource-management
Daniel C. Sobral
źródło
źródło
Odpowiedzi:
Na razie Scala 2.13 wreszcie obsługuje:
try with resources
przy użyciu użycia :), Przykład:lub używając
Using.resource
unikajTry
Więcej przykładów można znaleźć w sekcji Korzystanie z doc.
źródło
Using.resource
wariant?using
metoda:def using[A <: AutoCloseable, B](resource: A) (block: A => B): B = try block(resource) finally resource.close()
Wpis Chrisa Hansena „ARM Blocks in Scala: Revisited” z 26.03.2009 mówi o slajdzie 21 z prezentacji FOSDEM Martina Odersky'ego . Następny blok pochodzi bezpośrednio ze slajdu 21 (za zgodą):
- wyślij wycenę -
Wtedy możemy zadzwonić w ten sposób:
Jakie są wady tego podejścia? Wydaje się, że ten wzorzec dotyczy 95% obszarów, w których potrzebowałbym automatycznego zarządzania zasobami ...
Edycja: dodano fragment kodu
Edit2: rozszerzenie wzorca projektowego - czerpanie inspiracji z
with
instrukcji Pythona i adresowanie:Managed
klasyTo jest w przypadku Scala 2.8.
źródło
Daniel,
Niedawno wdrożyłem bibliotekę Scala-Arm do automatycznego zarządzania zasobami. Dokumentację można znaleźć tutaj: https://github.com/jsuereth/scala-arm/wiki
Ta biblioteka obsługuje trzy style użytkowania (obecnie):
1) Tryb rozkazujący / do wyrażenia:
2) Styl monadyczny
3) Styl z ograniczonymi kontynuacjami
Oto serwer TCP „echo”:
Kod wykorzystuje cechę typu zasobu, dzięki czemu jest w stanie dostosować się do większości typów zasobów. Ma rezerwę do używania typowania strukturalnego dla klas z metodą close lub dispose. Zapoznaj się z dokumentacją i daj mi znać, jeśli myślisz o przydatnych funkcjach do dodania.
źródło
Oto rozwiązanie Jamesa Iry'ego wykorzystujące kontynuacje:
Oto rozwiązania z kontynuacjami do porównania i bez nich:
A oto sugestia Tiarka Rompfa dotycząca poprawy:
źródło
BufferedWriter
nie zgłasza sprawdzonych wyjątków, więc jeśli zostanie zgłoszony jakikolwiek wyjątek, program nie powinien go odzyskać.Widzę stopniową 4-stopniową ewolucję robienia ARM w Scali:
źródło
Jest lekki (10 linii kodu) ARM dołączony do lepszych plików. Zobacz: https://github.com/pathikrit/better-files#lightweight-arm
Oto jak to jest zaimplementowane, jeśli nie chcesz całej biblioteki:
źródło
map
iflatMap
metodę dla CloseableOps zamiast foreach, aby dla zrozumienia nie dawała przemierzalnego.Co powiesz na używanie klas Type
źródło
Inną alternatywą jest monada Lazy TryClose Choppy'ego. Całkiem dobrze z połączeniami z bazą danych:
Oraz ze strumieniami:
Więcej informacji tutaj: https://github.com/choppythelumberjack/tryclose
źródło
Oto odpowiedź @ chengpohi, zmodyfikowana tak, aby działała ze Scalą 2.8+, zamiast tylko ze Scalą 2.13 (tak, działa również ze Scalą 2.13):
źródło