6

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

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)
}

我觉得这有点奇怪,尤其是最后一部分acquireAndGetof identity。有没有更好的办法 ?

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

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

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

我看到 a 上的地图ManagedResource返回 an ,我可以使用该方法ExtractableManagedResource从中提取结果。只返回一个。是否有一个原因 ?optflatMapManagedResource

4

1 回答 1

3

我也觉得这很奇怪,map应该flatMap以稍微不同的方式表现。
也许映射操作提供了更多的自由来暴露通过 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
}

警告:代码未经测试

于 2012-12-12T11:23:05.217 回答