Essential Scala: Loan Pattern

資源自動回收是計算機工程實踐中一項重要的實現(xiàn)模式,例如:

  • C++: RAII技術(shù)
  • Java7以后:try-with-resources技術(shù)

本文通過using的抽象控制,透視Scala在這個領(lǐng)域的設(shè)計技術(shù)。

借貸模式:using

import scala.language.reflectiveCalls

object using {
  def apply[R <: { def close(): Unit }, T](resource: => R)(f: R => T): T = {
    var source: Option[R] = None
    try {
      source = Some(resource)
      f(source.get)
    } finally {
      for (s <- source)
        s.close
    }
  }
}

形式化

拋開using.apply復雜的類型修飾符,其算法可形式化為:

Input: Given resource: R
Output:T
Algorithm:Call back to user namespace: f: R => T, and make sure resource be closed on done.

給定一個資源R,并將資源傳遞給用戶空間,并回調(diào)算法f: R => T;當過程結(jié)束時資源自動釋放。為此,using常常被稱為「借貸模式」,是保證資源自動回收的重要機制。

鴨子編程

R <: { def close(): Unit }表明R類型必須是具有def close(): Unit方法的子類型,這是Scala支持「鴨子編程」的一種重要技術(shù)。

例如,File滿足R類型的特征。

惰性求值

resource: => R是按照by-name傳遞,在實參傳遞形參過程中,并未對實參進行立即求值,而將求值推延至resource: => R的調(diào)用點。

對于本例,using(Source.fromFile(source))語句中,Source.fromFile(source)并沒有馬上發(fā)生調(diào)用傳遞給形參,而將求值推延至source = Some(resource)語句,調(diào)用Some.apply方法時。

控制抽象

使得using形如內(nèi)置于語言的控制結(jié)構(gòu),其行為類似于if, while一樣。

def read: String = using(fromFile(source)) { 
  _.getLines.mkString(lineSeparator) 
}

for推導式

finally關(guān)閉資源時,使用for推導式過濾掉None。也就是說,如下三種形式是等價的。

  • 過濾掉None,并自動提取Option中的元素
for (s <- source)
  s.close
  • 使用if,但需要從Some中手動get
if (source != None)
  source.get.close
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 在抉擇的哪一刻,成敗實已露出端倪。 Scala擁有兩種參數(shù)傳遞的方式:Call-by-Value(按值傳遞)與Ca...
    劉光聰閱讀 17,529評論 2 18
  • 戲路如流水,從始至終,點滴不漏。一路百折千回,本性未變,終歸大海。一步一戲,一轉(zhuǎn)身一變臉,撲朔迷離。真心自然流露,...
    劉光聰閱讀 2,078評論 3 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,590評論 19 139
  • 操作符重載? 舉個例子[P60]1 + 2 中的 +操作符是一個方法。 首先,在 Scala 中,萬物皆對象,包括...
    云之外閱讀 553評論 0 1
  • 小城姑娘 我愿做一個小城姑娘 一座小小的城 不要太繁華 也不要太冷清 那里有著 我喜歡的青石板路 還有我喜歡的人們...
    是染兒兒吖閱讀 358評論 0 4

友情鏈接更多精彩內(nèi)容