2013-06-01 54 views
1

我正在學習scala,喜歡自定義控制結構的能力,並且由於沒有關閉資源的結構,所以我認爲寫一個結構會很方便。然後,我從David Pollak的書「Beginning Scala」中找到了這段代碼。在Scala中定製「使用」控制結構

using (Source.fromFile("file")) { source => 
    println(source.mkString) 
    } 

    def using[A <: { def close() }, B](closable: A)(body: A => B): B = 
    try 
    body(closable) 
    finally 
    closable.close() 

但我不知道是否有可能有類似:

using (val source = Source.fromFile("file")) println(source.mkString) 
+1

相關:[序號1](http://stackoverflow.com/questions/2395984/scala-using-function)和[第2](http://stackoverflow.com/questions/2207425/what-automatic-resource-management-alternatives-exists-for-scala ) –

+0

AFAIK不,因爲你使用「來源:在不同的範圍,而不是一個你宣佈它))但是,你可以使用理解來做到這一點(monads),並且你在上面發佈的類CPS風格對我來說看起來足夠好。 – vitalii

回答

2

由於vitalli表明,簡單的答案是沒有(可惜)。希望如果我解釋你在Pollak書中找到的方法定義和調用,那麼它會變得清楚爲什麼。

def using[A <: { def close() }, B](closable: A)(body: A => B): B 

此使用方法定義有兩個參數列表(請參閱currying)。兩個列表都有一個參數。第一個參數是可關閉的對象(類型A)。第二個是從AB的函數。

當調用與此行中的方法:

using (Source.fromFile("file")) { source => println(source.mkString) } 

第一個參數是的Source.fromFile("file")返回值是可封閉的BufferedSource。第二個參數是anonymous function,它表示:採用一個參數source,在其主體println(source.mkString)中有一個語句並返回Unit

Scala編譯器會自動檢測方法定義中source的類型以及您提供的第一個參數(一個BufferedSource)。你可以重構的是匿名函數和顯式聲明的類型,如果你想太多:

using(Source.fromFile("file"))(eg) 
def eg(source: BufferedSource): Unit = println(source.mkString) 

當然不過,匿名函數是更簡潔!