【发布时间】:2025-12-01 16:15:01
【问题描述】:
Scala in Depth 演示了 Loaner 模式:
def readFile[T](f: File)(handler: FileInputStream => T): T = {
val resource = new java.io.FileInputStream(f)
try {
handler(resource)
} finally {
resource.close()
}
}
示例用法:
readFile(new java.io.File("test.txt")) { input =>
println(input.readByte)
}
此代码看起来简单明了。什么是 Scala 中 Loaner 模式的“反模式”,以便我知道如何避免它?
【问题讨论】:
-
请注意,它在
Future上失败:readFile(...) { in => Future { println(in.readByte) } }。in.readByte可以在close之后执行。 -
有趣。所以,为了避免这个问题,干脆不要在这种模式下使用
Future? -
也不要返回
in或任何可能包含in的内容:readFile(...){in => b: Byte => input.readByte + b}。 (注意FileInputStream中没有readByte方法)。 -
在truecommons.io中有这个模式的实现。
-
从 Scala 2.13 开始,不需要编写自己的贷款模式实现,因为有一个 Using 实用程序。 def readFile[T](f: File)(handler: FileInputStream => T): T = Using.resource(new FileInputStream(f))(handler)
标签: scala