我一直试图理解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
答案 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
方法从Connection
到Unit
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}