2011-09-16 54 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。