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

それは私には少し奇妙に見えます、特にの最後のacquireAndGet部分identity。もっと良い方法はありますか?

一般的な質問は、このスタイルをどのように使用してこのようなことを行うかということです。

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

動作は、理解のための操作が失敗した場合、例外をメソッドから伝播させ、リソースを閉じる必要があるというものです。

メソッドを使用して結果を抽出できるManagedResourceリターンのマップを見ました。のみを返します。これには理由がありますか?ExtractableManagedResourceoptflatMapManagedResource

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 に答える