一次性资源模式

时间:2013-03-20 12:12:30

标签: scala resource-cleanup disposable

Scala库中是否有任何标准化支持 可支配资源模式

我的意思是类似于C#和.NET支持的东西,只提一个。

例如,官方Scala库提供的内容如下:

trait Disposable { def dispose() }

class Resource extends Disposable

using (new Resource) { r =>

}

注意:我知道这篇文章«Scala finally block closing/flushing resource»但它似乎没有集成在标准库中

2 个答案:

答案 0 :(得分:2)

此时,您需要查看Scala ARM的常见实现。但是,正如您所提到的,它是一个单独的库。

了解更多信息:

This answerfunctional try & catch w/ Scala链接到scala wiki上的Loan Pattern,其中包含代码示例。 (我不会重新发布链接,因为链接可能会发生变化)

Using a variable in finally block有几个答案显示你可以编写自己的方法。

答案 1 :(得分:0)

Scala 2.13开始,标准库提供了专用的资源管理实用程序:Using

您只需要使用Releasable特性提供关于如何释放资源的隐式定义:

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的伴随对象中。


请注意,您也可以使用Java的AutoCloseable代替Using.Releasable,因此可以使用任何实现AutoCloseable的Java或Scala对象(例如scala.io.Sourcejava.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")