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

针对Scala的Java 7风格自动资源管理,java,scala,Java,Scala,Java 7引入了自动资源管理: try (BufferedReader br = new BufferedReader(new FileReader(path))) { return br.readLine(); } 这将适用于实现java.lang.AutoClosable的任何类 我知道有几个在Scala中进行自动资源管理的例子,包括Martin Odersky演示的一个 是否有计划向Scala中添加语言级资源管理,类似于Java的try(…){}?我不知道Scala中有专门为此设计

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

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
  return br.readLine();
}
这将适用于实现
java.lang.AutoClosable
的任何类

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


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

我不知道Scala中有专门为此设计的特性,但下面是一个使用Java Closable上的loan模式的示例:

编辑

您甚至可以通过以下操作创建更通用的借贷者:


在scala中,这可以作为库添加。以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);
  }
}

github页面上还有一些例子,Scala规范非常精简,因为几乎所有可以通过标准库实现的东西都是。因此,没有必要在语言本身中添加ARM

到目前为止,Scala还没有真正的IO API(默认为Java IO API)。未来的Scala IO API可能会包含某种形式的ARM。例如,有ARM。

更好的文件中包含了重量更轻(10行代码)的ARM。见:

导入更好的文件_
为了{

在我看来[scala语言]邮件列表将是一个更好的提问地方。我认为如果它被添加,那么就不是作为一种语言功能,而是作为std库的一部分。根据下面的答案,不会添加任何语言级功能,因为使用现有的语言功能很容易做到。我想我应该修改我的问题,询问是否有任何计划添加模式到标准库。它是否是语言或标准库的一部分对我来说真的不重要,只要它不使用外部资源就可以使用。编写一个具有37个Maven依赖项的1页实用程序似乎很愚蠢:-)。我真的应该开始使用它。我已经错过了C#的一次性模式很多年了。呵呵as;)…@Ralph我刚刚添加了一个指向JPPellet示例的链接,这个链接非常通用
val first_ten_bytes = managed(new FileInputStream("test.txt")) map { 
   input =>
     val buffer = new Array[Byte](10)
     input.read(buffer)
     buffer
}
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