gpt4 book ai didi

scala 链接尝试使用需要 finally/close() 的托管资源

转载 作者:行者123 更新时间:2023-12-02 08:39:16 25 4
gpt4 key购买 nike

为了练习,我得到了一些简单的 JDBC 内容,从大约 100 行到现在,但它不会进行类型检查。有任何想法吗?更好的方法?

def withResultSet[T](sql: String, f: ResultSet => T)(implicit info: ConnectionInfo): Try[T] = {
for {
conn <- Try(connect(info))
stmt <- Try(conn.createStatement()) orElse { case err: SQLException => {conn.close(); err} }
results <- Try(stmt.executeQuery(sql)) orElse { case err: SQLException => { conn.close(); stmt.close(); err }}
} yield f(results)
}

我的错误是

 missing parameter type for expanded function
The argument types of an anonymous function must be fully known. (SLS 8.5)
Expected type was: scala.util.Try[?]
stmt <- Try(conn.createStatement()) orElse { case err: SQLException => {conn.close(); err} }
^

最佳答案

我不知道 Try 是处理不再需要的资源的正确工具。至少我看不到明显的方法。你可能想看看 https://github.com/jsuereth/scala-arm .那么您的代码可能如下所示:

def withResultSet[T](sql: String, f: ResultSet => T)(
implicit info: ConnectionInfo): ManagedResource[T] = for {
conn <- managed(connect(info))
stmt <- managed(conn.createStatement())
results <- managed(stmt.executeQuery(sql))
} yield f(results)

您可以继续使用 map 或 flatMap(或用于理解)来处理可能的其他资源,最后您可以从中获得 OptionEither并同时关闭所有需要关闭的东西。

关于scala 链接尝试使用需要 finally/close() 的托管资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18071266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com