2011-09-16 55 views
11

Java 7的自动资源管理已经引进了自动资源管理:Java 7的风格斯卡拉

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

这将实现java.lang.AutoClosable任何类的工作。

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

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

+0

我认为[scala语言]邮件列表将是一个更好的地方来问这个问题。 – missingfaktor

+2

我想如果它被添加,那么不是作为语言功能,而是作为std lib的一部分。 – ziggystar

+0

根据以下答案,不会添加任何语言级别的功能,因为使用现有语言功能很容易实现。 – sourcedelica

回答

13

在scala中,这可以作为库添加。如从jsuereth一个例子阶臂(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

我不知道的是,在斯卡拉专门设计的任何特质,但这里是一个使用Java的可关闭的贷款模式的例子:

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

+1

+1 for Alois :) –

+0

hehe Thomas;)... @Ralph我刚刚添加了JPPellet示例的链接,它非常通用 –

2

Scala的规格是非常薄,因为几乎所有可以通过标准库实现的东西都是。因此,在语言本身中不需要添加ARM。到目前为止,Scala并没有真正的IO API(默认使用Java IO API)。未来的Scala IO API很可能会包含某种形式的ARM。例如,scala-io有ARM。