9

Scala 库中是否有任何标准化来支持一次性资源模式

我的意思是类似于 C# 和 .NET 支持的东西,仅举一个例子。

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

trait Disposable { def dispose() }

class Resource extends Disposable

using (new Resource) { r =>

}

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

4

2 回答 2

3

开始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.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")
于 2019-03-31T18:50:34.600 回答
1

此时,您将需要查看Scala ARM以获得通用实现。不过,正如您所提到的,它是一个单独的库。

了解更多信息:

This answer at functional try & catch w/Scala链接到具有代码示例的 scala wiki 上的 Loan Pattern。(我不会重新发布链接,因为链接可能会更改)

在 finally 块中使用变量有一些答案显示了您可以编写自己的方法。

于 2014-01-20T22:11:25.277 回答