这几乎是微不足道的,使自己的覆盖(这里使用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