是否有隻包裝傳遞函數的返回類型的方法?如何在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