gpt4 book ai didi

scala - 使用 Scala ARM 库读取简单文件

转载 作者:行者123 更新时间:2023-12-03 01:19:17 25 4
gpt4 key购买 nike

我正在使用ARM library将资源文件读入字符串。我使用的代码是这样的:

def readResource(reosurceName: String): String = {
val res = for (writer <- managed(new StringWriter);
is <- managed(this.getClass.getClassLoader.getResourceAsStream(resourceName))) yield {
IOUtils.copy(is, writer)
writer.toString
}
res.acquireAndGet(identity)
}

对我来说这看起来有点奇怪,尤其是 identityacquireAndGet 的最后一部分。有更好的办法吗?

一般问题是,你将如何使用这种风格来做这样的事情

val x: String=
for (res1 <- managed(...);
res2 <- managed(...);
...
resn <- managed) yield {
f(res1, res2, ..., resn)
}

行为是,如果 for 理解中的操作失败,我希望将异常传播到方法之外,并且应该关闭资源。

我看到 ManagedResource 上的映射返回一个 ExtractableManagedResource,我可以使用 opt 方法从中提取结果。 flatMap 仅返回一个ManagedResource。这有什么原因吗?

最佳答案

我也觉得很奇怪,mapflatMap 的行为方式应该略有不同。
也许映射操作可以更自由地公开无法通过 flatMap 获得的简化结果。

无论如何,您可以按如下方式构建代码以获得看起来更有吸引力的东西

def readResource(resourceName: String): Option[String] = {
val managedWriter = {
managed(new StringWriter) and
managed(this.getClass.getClassLoader.getResourceAsStream(resourceName))
} map { case (writer, is) =>
IOUtils.copy(is, writer)
writer.toString
}
}
managedWriter.opt
}

警告:代码未经测试

关于scala - 使用 Scala ARM 库读取简单文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13837533/

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