如何理解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,用完就不用管了。


在程序編寫中,我們可能經常遇到這樣的情況:

  • 打開某個日誌文件,統計其中滿足某種條件的記錄的條數,然後關閉文件
  • 打開某個視頻文件,對其中的目標進行跟蹤,得到目標的運動軌跡,然後關閉視頻文件

...

是不是覺得很重複,為了對這種

  1. 打開冰箱(某種資源)
  2. 把大象塞進去;把獅子塞進去;把菜取出來...(操作資源)
  3. 輕輕關閉冰箱(某種資源)

模式進行編程處理,就可以採用「借貸」模式

借貸模式是一種控制抽象函數(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年你應該學習的語言和框架

TAG:編程語言 | Scala |