Автоматическое управление ресурсами в стиле Java 7 для Scala - PullRequest
11 голосов
/ 16 сентября 2011

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

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

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

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

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

Ответы [ 4 ]

13 голосов
/ 16 сентября 2011

В Scala это может быть добавлено в виде библиотеки. В качестве примера скала-арм (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 есть еще несколько примеров

3 голосов
/ 16 сентября 2011

Мне не известно о каких-либо чертах, специально разработанных для этого в Scala, но вот пример использования шаблона заимствования в Java Closable:

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

EDIT

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

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

2 голосов
/ 16 сентября 2011

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

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

0 голосов
/ 10 октября 2015

Существует легкая (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...