如何理解Scala中的借貸模式(loan pattern)?
為何需要借貸模式?什麼地方需要使用借貸模式?
這不是Scala的,這只是一種常用的對系統資源操作的封裝,為了防止資源不被安全釋放(close),其次用戶代碼不用考慮資源來自何處,以及如何歸還,只要用就行,lift mongo對dbcollection的使用大量採用這種模式,C#的using關鍵字就是對這種模式的封裝,對任何的外部資訪問都可以用這種模式
另外,謝邀,不謝謝邀。道理 @夏梓耀 已經說的很清楚,我就補一段代碼例子:
def withReader[T](fileName: String)(f: BufferedReader =&> T): T = {
//purposely use java style file processing instead of scala.io.Source.fromFile
var reader: BufferedReader = null
try {
reader = new BufferedReader(new FileReader(fileName))
f(reader)
}finally{
if(reader != null){
reader.close()
}
}
}
這個函數負責創建資源和關閉資源(這個例子里就是給定文件的BufferedReader)
withReader("/tmp/test.txt"){ bf =&>
val fstLine = bf.readLine()
println(fstLine)
}
這是用資源的地方,直管使用BufferedReader,用完就不用管了。
在程序編寫中,我們可能經常遇到這樣的情況:
- 打開某個日誌文件,統計其中滿足某種條件的記錄的條數,然後關閉文件
- 打開某個視頻文件,對其中的目標進行跟蹤,得到目標的運動軌跡,然後關閉視頻文件
...
是不是覺得很重複,為了對這種- 打開冰箱(某種資源)
- 把大象塞進去;把獅子塞進去;把菜取出來...(操作資源)
- 輕輕關閉冰箱(某種資源)
模式進行編程處理,就可以採用「借貸」模式
借貸模式是一種控制抽象函數(control-abstraction function),它試圖打開某項資源,然後將對資源的所有權暫時"借貸"給其它函數,待其它函數完成操作之後,所有權回收回來。試看scala代碼(源自Programming in Scala, 2nd Edition)
// 函數定義
def withPrintWriter(file: File)(op: PrintWriter =&> Unit){
val writer = new PrintWriter(file)
try{
op(writer)
}finally{
writer.close()
}
}
// 函數調用
val file = new File("date.txt")
withPrintWriter(file){
writer =&> writer.println(new java.util.Date)
}
知道JAVA嗎? 你對著模板方法看一下
不清楚,看樓下的回答貌似是模板方法的一種,類似於jdbctemplate里的executequery
占坑先
推薦閱讀:
※你見過哪些令你瞠目結舌的 Scala 代碼技巧?
※Scala 是一門怎樣的語言,具有哪些優缺點?
※2016年你應該學習的語言和框架