Я видел много примеров ARM (автоматического управления ресурсами) в Интернете для Scala. Написание одного из них кажется своеобразным обрядом, хотя большинство из них очень похожи друг на друга. Я сделал увидеть довольно прохладный пример использования продолжений, хотя.
Во всяком случае, у многих из этого кода есть недостатки того или иного типа, поэтому я подумал, что было бы неплохо иметь ссылку здесь на Stack Overflow, где мы можем проголосовать за наиболее правильные и подходящие версии.
scala
resource-management
Дэниел С. Собрал
источник
источник
Ответы:
На данный момент Scala 2.13 наконец-то поддерживает:
try with resources
с использованием Using :), Пример:или используя
Using.resource
избежатьTry
Вы можете найти больше примеров в Использование doc.
источник
Using.resource
вариант?using
метод:def using[A <: AutoCloseable, B](resource: A) (block: A => B): B = try block(resource) finally resource.close()
В записи блога Криса Хансена « Блоки ARM в Scala: новый взгляд» от 26 марта 2009 года говорится о слайде 21 презентации FOSDEM Мартина Одерски . Следующий блок взят прямо из слайда 21 (с разрешения):
- конец цитаты -
Тогда мы можем позвонить так:
В чем недостатки такого подхода? Этот шаблон, похоже, подходит для 95% случаев, когда мне нужно автоматическое управление ресурсами ...
Изменить: добавлен фрагмент кода
Edit2: расширение шаблона проектирования - вдохновение из
with
инструкции python и адресация:Managed
классаЭто в Scala 2.8.
источник
Даниэль,
Недавно я развернул библиотеку scala-arm для автоматического управления ресурсами. Вы можете найти документацию здесь: https://github.com/jsuereth/scala-arm/wiki
Эта библиотека поддерживает три стиля использования (в настоящее время):
1) Императив / выражение для выражения:
2) Монадический стиль
3) Стиль продолжения с разделителями
Вот tcp-сервер "echo":
В коде используется характеристика типа ресурса, поэтому он может адаптироваться к большинству типов ресурсов. У него есть возможность использовать структурную типизацию для классов с помощью метода close или dispose. Пожалуйста, ознакомьтесь с документацией и дайте мне знать, если вы думаете о добавлении каких-либо полезных функций.
источник
Вот решение Джеймса Айри с использованием продолжений:
Вот решения с продолжениями и без них для сравнения:
А вот предложение Тиарка Ромпфа по улучшению:
источник
BufferedWriter
не генерирует проверенных исключений, поэтому, если возникает какое-либо исключение, не ожидается, что программа восстановится после него.Я вижу постепенное четырехэтапное развитие ARM в Scala:
источник
В состав better-files входит облегченная (10 строк кода) ARM. См. Https://github.com/pathikrit/better-files#lightweight-arm
Вот как это реализовано, если вам не нужна вся библиотека:
источник
map
andflatMap
для CloseableOps вместо foreach, чтобы для понимания не получился обходной путь.Как насчет использования классов типов
источник
Другой альтернативой является монада Lazy TryClose от Choppy. С подключениями к базе данных неплохо:
И с потоками:
Подробнее здесь: https://github.com/choppythelumberjack/tryclose
источник
Вот ответ @chengpohi, измененный так, чтобы он работал со Scala 2.8+, а не только со Scala 2.13 (да, он также работает со Scala 2.13):
источник