在python中你可以避免try {} catch {} finally {}样板文件with(参见什么是python关键字"with"用于?).我记得在Scala中看到了替代方案,但我再也找不到了.
它遵循以下方针:
def using[O](r: {def close()})(doit: () => O): O = try {
doit()
} finally {
r.close
}
using(myWriter){() => myWriter.println("something or another")}
Run Code Online (Sandbox Code Playgroud)
它是内置于2.10,还是我需要一个单独的库?
制作自己的几乎所有用例(这里使用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) }
}
Run Code Online (Sandbox Code Playgroud)
如果要通过异常,请按原样使用:
scala> Option(null: String).tidily(println){_.get} // Should print None
None
java.util.NoSuchElementException: None.get
at scala.None$.get(Option.scala:313)
...
Run Code Online (Sandbox Code Playgroud)
如果要处理异常,请将其与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)
Run Code Online (Sandbox Code Playgroud)
通常你会做g类似的东西_.close,但你可以用它做任意资源清理.例如,每当我们完成时,我们将一个计数器退回:
var i = 0
val a = Array(1,2)
a.tidily(_ => i -= 1){ _.foreach(_ => i += 1) }
scala> i
res2: Int = 1
Run Code Online (Sandbox Code Playgroud)