すでに似たようなものがありましたhere。
TLTR; Tryモナドで標準的な方法はありません。
通常の回避策は、このようなものです:あなたは次のように使用することができます
def use[A <: { def close(): Unit }, B](resource: A)(code: A ⇒ B): B =
try {
code(resource)
} finally {
resource.close()
}
:
val path = Paths get "/etc/myfile"
use(Files.newInputStream(path)) { inputStream ⇒
val firstByte = inputStream.read()
....
}
hereを説明されている別のアプローチを、あなたは標準の「トライ」を「伸ばす」ことを意味し追加のメソッド 'withRelease'を追加することにより、追加されます。
implicit class TryOps[A <: { def close(): Unit }](res: Try[A]) {
def withRelease() = res match {
case Success(s) => res.close(); res
case Failure(f) => res.close(); res
}
}
Th en、
Try {
val inputStream = Files.newInputStream(path))
...
inputStream
}.withRelease()
出典
2017-06-09 15:03:57
fGo
なぜf:Lock => Aですか?なぜあなたが外部でそれを取得している場合、関数にロックを渡す?サンクがやる名前のように思える?ロックの場合は 'f:=> A' –
、そうでしょう。パターンは、 'ブロック'の内部で使用される必要のある接続のようなものによく適合します。 –