[追記] Scala 2.13.0 で標準ライブラリに scala.util.Using
が追加されました〜。
https://www.scala-lang.org/api/2.13.0/scala/util/Using$.html
Scalaでローンパターンを使いたくなるたび、「Scala using(Hishidama's Scala loan-pattern Memo)」を見ながら実装して、だいたい以下の形に落ちつくので、今更ながらメモ。
import java.io.Writer
import scala.io.Source
object Using {
def apply[A, B](resource: A)(process: A => B)(implicit closer: Closer[A]): B =
try {
process(resource)
} finally {
closer.close(resource)
}
}
case class Closer[-A](close: A => Unit)
object Closer {
implicit val sourceCloser: Closer[Source] = Closer(_.close())
implicit val writerCloser: Closer[Writer] = Closer(_.close())
}
自分がこうしている理由は、
- なるべく短く実装したい。
- 構造的部分型はリフレクションなので使いたくない。
- for文で使えるようにしたいけど、モナドにするのは面倒そうなので、ネスト辛くなったら考える。