Я смотрю на библиотеку scala-arm , подсказанную этим ответом , и она отлично подходит для управления ресурсами в большинстве контекстов.
Есть однаконтекст, тем не менее, на первый взгляд кажется, что он не справляется: это «передача» ресурса другому ресурсу.Это часто возникает при работе с I / O:
for (fin <- managed(new FileInputStream(file));
// almost what we want, except see below
gzip <- managed(new GZIPInputStream(fin));
src <- managed(Source.fromInputStream(gzip))) {
/* some fancy code */
}
Теперь проблема в следующем: если gzip
успешно создан, то it отвечает за закрытие fin и fin не должны закрываться ( update : это не совсем верно - двойное закрытие - это хорошо; см. принятый ответ).Альтернатива, однако:
for (src <- managed(Source.fromInputStream(
new GZIPInputStream(new FileInputStream(file))))) {
/* some fancy code */
}
не совсем корректна - если в конструкторе GZIPInputStream
есть (предположительно маловероятная) ошибка, FileInputStream
не закрывается.То же самое для fromInputStream
.
Предоставляет ли scala-arm (или какую-либо другую упаковку) средство для безопасной обработки этой очистки, которую я еще не нашел?