开始Scala 2.13
,标准库提供了一个专用的资源管理实用程序:Using
.
Releasable
您只需使用trait提供如何释放资源的隐式定义:
import scala.util.Using
import scala.util.Using.Releasable
case class Resource(field: String)
implicit val releasable: Releasable[Resource] = resource => println(s"closing $resource")
Using(Resource("hello world")) { resource => resource.field.toInt }
// closing Resource(hello world)
// res0: scala.util.Try[Int] = Failure(java.lang.NumberFormatException: For input string: "hello world")
请注意,Resource
为了清楚起见,您可以将隐式可释放对象放在伴随对象中。
请注意,您也可以使用 JavaAutoCloseable
代替,Using.Releasable
因此任何 Java 或 Scala 对象实现AutoCloseable
(例如scala.io.Source
或java.io.PrintWriter
)都可以直接与 一起使用Using
:
import scala.util.Using
case class Resource(field: String) extends AutoCloseable {
def close(): Unit = println(s"closing $this")
}
Using(Resource("hello world")) { resource => resource.field.toInt }
// closing Resource(hello world)
// res0: scala.util.Try[Int] = Failure(java.lang.NumberFormatException: For input string: "hello world")