我正在尝试使用部分应用的函数在scala中创建一个方便的数据库调用包装器:
def queryResult[B](connection: Connection, sql: String)(process: (CallableStatement,ResultSet) => B): B =
using (connection) { connection =>
using (connection.prepareCall(sql)) { statement =>
var rs: ResultSet = null
try {
process(statement, rs)
} finally if (rs != null) {
try {
rs.close()
}
catch {
case e: SQLException => {}
}
}
}
}
主要用于自动关闭连接/结果集。但是,我希望rs
变量作为var返回,而不是val。每当我尝试从查询中将rs分配给结果集时,我都会收到一个错误,我无法重新分配给val。
或者,如果您有其他方法可以最大化代码重用以打开/关闭流/连接,请分享。
编辑:正如Randall Schulz所说,Scala ARM将解决实际问题。然而,我发布的问题在Scala中不受支持。
答案 0 :(得分:3)
您似乎想要的是一种称为pass-by-reference的东西,它不是一种非常常见的编程语言。 Scala不支持它。
在这种情况下,只需使“process”返回ResultSet而不是将其作为参数。
def queryResult[B](connection: Connection, sql: String)(process: CallableStatement => (ResultSet, B)): (ResultSet, B) =
using (connection) { connection =>
using (connection.prepareCall(sql)) { statement => {
val (rs, result) = process(statement)
if (rs != null)
try rs.close
catch {
case _ : SQLException =>
}
result
}
}
}