gpt4 book ai didi

scala - 在 finally block 中使用变量

转载 作者:行者123 更新时间:2023-12-04 18:49:53 25 4
gpt4 key购买 nike

这是 Scala 中的代码:

def write() = {
try {
val out = new PrintWriter(new BufferedWriter(new FileWriter(fileName, true)))
out.println("123")
out.close
} catch {
case e: IOException => {}
}

//finally {
//out.close // ops, it's not visible in this context
//}
}

finally block 中有“out.close”会更好,不是吗?但我不想使用 var。

我的问题是,我该如何实现?

最佳答案

block 中定义的变量是该 block 的局部变量。因此,如果您坚持手动使用 try/finally,则必须将 val 移出 block 。

然而,你想要实现的是创建一个资源,在 block 中使用它,并在离开 block 时调用它的关闭方法,无论你是正常离开 block 还是通过异常异常离开 block 。这是一个极其常见的问题,因此已经有一个库,名为 Scala ARM . ARM 代表自动资源管理。

这是基本用法:

import resource._
for(input <- managed(new FileInputStream("test.txt")) {
// Code that uses the input as a FileInputStream
}

有一些关于将此构造移至 Scala 标准库的讨论,因此将来您可能甚至不需要外部依赖项。

我会推荐使用库来做这样的事情。它只是你的 build.sbt 中的一行。但出于教育目的,以下是您自己推出的方法:

def managed[T <: AutoCloseable](resource:T) = new Traversable[T] {
def foreach[U](f:T=>U) {
try {
f(resource)
} finally {
resource.close()
}
}
}

下面是使用方法

scala> for(reader<-managed(new java.io.FileReader("/etc/passwd"))) { println(reader.read()) }
114

scala> for(reader<-managed(new java.io.FileReader("/etc/shadow"))) { println(reader.read()) }
java.io.FileNotFoundException: /etc/shadow (Permission denied)
...

您仍然会得到异常,但会调用关闭。当然,如果关闭也抛出异常,这将隐藏原始异常。像这样的小细节在 scala ARM 中可能处理得更好。

关于scala - 在 finally block 中使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17627599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com