0

我正在尝试通过使用部分应用的函数在 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 不支持我发布的问题。

4

1 回答 1

3

您似乎想要的是一种称为 pass-by-reference 的东西,它不是一种非常常见的功能编程语言。Scala 不支持它。

在这种情况下,只需让“进程”返回一个 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
       }
     }
   }
于 2013-01-11T20:44:35.177 回答