是否有只包装传递函数的返回类型的方法?如何在Scala中包装传递函数的返回类型
我试图自动使用自动管理资源从try-with-resources scala equivalent。我想要做的是嵌套托管资源,即做类似的事情:
cleanly(db.connect())(_.close()) { connection =>
cleanly(connection.prepareCall("{call procedure}"))(_.close()) { statement =>
statement.setInt("batch", 1)
statement.execute()
}
}
但是,返回Try [Try [B]]。所以我稍微修改了签名和实施清洁功能:
def cleanly[A, B](resource: A)(cleanup: A => Unit)(doWork: A => Try[B]): Try[B] = {
try {
doWork(resource)
}
finally {
try {
if (resource != null) {
cleanup(resource)
}
} catch {
case e: Exception => log.error("Error cleaning up resource.", e) // should be logged
}
}
}
我试着从一个新添加的方法tryCleanly这将包裹传递函数返回一个尝试对象调用它:
def tryCleanly[A, B](resource: A)(cleanup: A => Unit)(doWork: A => B): Try[B] = {
cleanly[A,B](resource)(cleanup)(Try(doWork))
}
但是做尝试(的doWork)的结果是
Try[(A) => B]
而不是
(A) => Try[B]
是否可以只包装函数的结果类型?
没错,但我想的是更多的一元风格。如果我拥有两个以上的嵌套资源,那么我将需要多次调用flatten,这并不理想 – user3681304