這幾乎是微不足道的,使自己的覆蓋(這裏使用2.10)幾乎所有的用例:
implicit class TidyUpAnything[A](val a: A) extends AnyVal {
def tidily[Z](g: A=>Any)(f: A=>Z) = try { f(a) } finally { g(a) }
}
如果你想例外通過使用如:
scala> Option(null: String).tidily(println){_.get} // Should print None
None
java.util.NoSuchElementException: None.get
at scala.None$.get(Option.scala:313)
...
和如果要處理異常,請與scala.util.Try結合使用:
scala> import scala.util._
scala> Try(Option(null: String).tidily(println){ _.get })
None
res1: scala.util.Try[String] = Failure(java.util.NoSuchElementException: None.get)
通常情況下,您會使g
變成_.close
,但您可以使用它進行任意資源清理。例如,在這裏我們回到關閉的一個計數器,每當我們完成:
var i = 0
val a = Array(1,2)
a.tidily(_ => i -= 1){ _.foreach(_ => i += 1) }
scala> i
res2: Int = 1
這樣做的最廣爲人知的庫https://github.com/jsuereth/scala-arm,也沒有,據我所知沒有按階」 t開箱即用提供此功能 – 2013-03-20 08:58:34