Java 7风格的自动资源管理在Scala中的应用

11

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

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

这将适用于实现了java.lang.AutoClosable接口的任何类。

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

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


我认为在[scala-language]邮件列表中询问这个问题会更合适。 - missingfaktor
2
我认为如果这被添加的话,不应该作为一种语言特性,而是作为标准库的一部分。 - ziggystar
根据下面的答案,不会添加任何语言级别的功能,因为可以使用现有的语言特性轻松完成。 - sourcedelica
我想我应该修改我的问题,询问是否有计划将这个模式添加到标准库中。对我来说,它是作为语言或标准库的一部分并不重要,只要它可以在不使用外部资源的情况下使用即可。写一个有37个Maven依赖项的1页实用程序似乎很愚蠢:-)。 - Ralph
我真的应该开始使用它了。我已经错过了C#的可处理模式很长时间了。 - ripper234
因为我需要能够嵌套多个java.lang.AutoCloseable实例,每个实例都依赖于先前的实例成功实例化,所以我最终想出了一个对我非常有用的模式。我将其写成了类似StackOverflow问题的答案:https://dev59.com/qG445IYBdhLWcg3w_O8m#34277491 - chaotic3quilibrium
4个回答

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);
  }
}

单子风格

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

在github页面上有更多的例子。

3

嘿嘿,Thomas ;) ... @Ralph,我刚刚添加了一个链接到JPPellet示例,它非常通用。 - Alois Cochard

2

Scala规范相当简洁,因为几乎所有可以通过标准库实现的功能都已经被实现了。因此,在语言本身中添加ARM并没有真正的必要。

到目前为止,Scala没有真正的IO API(默认使用Java IO API)。未来的Scala IO API很可能会包括某种形式的ARM。例如,scala-io就有ARM。


0

在 better-files 中,有一个轻量级(仅 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接