Подтвердить что ты не робот

Автоматическое управление ресурсами Java 7 для Scala

Java 7 внедрила автоматическое управление ресурсами:

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
  return br.readLine();
}

Это будет работать с любым классом, который реализует java.lang.AutoClosable.

Я знаю, что есть несколько примеров автоматического управления ресурсами в Scala, в том числе один, продемонстрированный Мартином Одерским.

Есть ли какой-нибудь план добавления управления ресурсами на уровне языка в Scala, аналогичный Java try(...) { }?

4b9b3361

Ответ 1

В scala это можно добавить как библиотеку. В качестве примера scala -arm (https://github.com/jsuereth/scala-arm) из jsuereth:

Императивный стиль:

// Copy input into output.
for(input <- managed(new java.io.FileInputStream("test.txt"); 
    output <- managed(new java.io.FileOutputStream("test2.txt")) {
  val buffer = new Array[Byte](512)
  while(input.read(buffer) != -1) {
    output.write(buffer);
  }
}

Монадический стиль

val first_ten_bytes = managed(new FileInputStream("test.txt")) map { 
   input =>
     val buffer = new Array[Byte](10)
     input.read(buffer)
     buffer
}

На странице github приведены еще несколько примеров

Ответ 2

Я не знаю ни одного Трейта, специально разработанного для этого в Scala, но вот пример использования шаблона кредита на Java Closable:

http://whileonefork.blogspot.com/2011/03/c-using-is-loan-pattern-in-scala.html

ИЗМЕНИТЬ

Вы даже можете сделать более общий заемщик, сделав что-то вроде:

https://stackoverflow.com/questions/5945904/what-are-your-most-useful-own-library-extensions/5946514#5946514

Ответ 3

Scala спецификации довольно тонкие, потому что почти все, что может быть реализовано через стандартную библиотеку, есть. Таким образом, нет никакой реальной необходимости добавлять ARM в язык.

До сих пор Scala как никакой настоящий IO API (по умолчанию для Java IO API). Вероятно, что будущий API Scala IO будет включать в себя некоторую форму ARM. Например, scala-io имеет ARM.

Ответ 4

Имеется легкая (10 строк кода) ARM, включаемая с улучшенными файлами. См.: https://github.com/pathikrit/better-files#lightweight-arm

import better.files._
for {
  in <- inputStream.autoClosed
  out <- outputStream.autoClosed
} in.pipeTo(out)
// The input and output streams are auto-closed once out of scope