隐含Scala中的函数闭包

时间:2016-11-16 18:26:17

标签: scala implicit

我一直试图理解Scala的隐含并尝试在工作中使用它们 - 我坚持的一个特定地方是试图以下列方式传递隐含

object DBUtils {
  case class DB(val jdbcConnection: Connection) {

    def execute[A](op: =>Unit): Any = {
        implicit val con = jdbcConnection
        op
    }
}

object DB {
    def SQL(query: String)(implicit jdbcConnection: Connection): PreparedStatement = {
      jdbcConnection.prepareStatement(query)
    }
}

val someDB1 = DB(jdbcConnection)
val someDB2 = DB(jdbcConnection2)
val someSQL = SQL("SOME SQL HERE")
someDB1.execute{someSQL} 
someDB2.execute{someSQL} 

目前我得到一个execption,说SQL()函数找不到隐式jdbcConnection.What给出了什么,我该怎么做才能让它以我需要的格式工作?

Ps-:我在Scala(2.10.4)的稍旧版本上,无法升级

编辑:更改问题陈述更清楚 - 我不能在范围内使用单个隐式连接,因为我可以有多个具有不同连接的DB

3 个答案:

答案 0 :(得分:1)

在调用SQL时,范围内没有类型为Connection的隐式值。

在您的代码段中,jdbcConnection的声明丢失,但如果您从

更改声明
val jdbcConnection = //...

implicit val jdbcConnection = // ...

然后你将在范围内有一个Connection的隐式实例,编译器应该很高兴。

答案 1 :(得分:0)

试试这个:

implicit val con = jdbcConnection // define implicit here
val someDB = DB(jdbcConnection)
val someSQL = SQL("SOME SQL HERE") // need implicit here
someDB.execute{someSQL} 

隐式必须在您需要的范围内定义。 (实际上,它更复杂,因为您可以在文档中找到其他地方的规则。但最简单的方法是确保隐含在您需要的范围内可用。)

答案 2 :(得分:0)

进行以下更改

1)execute方法从ConnectionUnit

执行一项功能

2)而不是val someDB1 = DB(jdbcConnection)使用此someDB1.execute{implicit con => someSQL}

object DBUtils {
  case class DB(val jdbcConnection: Connection) {

    def execute[A](op: Connection =>Unit): Any = {
        val con = jdbcConnection
        op(con)
    }
}

这是完整的代码。

object DB {
    def SQL(query: String)(implicit jdbcConnection: Connection): PreparedStatement = {
      jdbcConnection.prepareStatement(query)
    }
}

val someDB1 = DB(jdbcConnection)
val someDB2 = DB(jdbcConnection2)
val someSQL = SQL("SOME SQL HERE")
someDB1.execute{implicit con => someSQL} 
someDB2.execute{implicit con => someSQL}