Scala的Java 7风格自动资源管理

Ral*_*lph 11 java scala

Java 7引入了自动资源管理:

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
  return br.readLine();
}
Run Code Online (Sandbox Code Playgroud)

这适用于任何实现的类java.lang.AutoClosable.

我知道有几个在Scala中进行自动资源管理的例子,包括Martin Odersky演示的一个例子.

是否有计划向Scala添加语言级资源管理,类似于Java try(...) { }

Fab*_*ian 13

在scala中,可以将其添加为库.作为jsuereth 的示例scala-arm(https://github.com/jsuereth/scala-arm):

势在必行的风格:

// 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

Monadic风格

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

在github页面上有一些例子