从部分应用函数中获取var vs val

时间:2013-01-11 19:56:22

标签: scala functional-programming partial-application

我正在尝试使用部分应用的函数在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中不受支持。

1 个答案:

答案 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
       }
     }
   }