此代码:
def insAll(values: MyRdt*) {
Db.withTransaction(session => { // Db is an org.scalaquery.session.Database instance
MyTable.insertAll(values: _*)(session)
})
}
无法编译。错误是
... missing parameter type
[error] Db.withTransaction(session => {
^
任何想法为什么?
如果我访问预定义的查询而不是MyTable.insertAll(values: _*)
,则编译正常。
奇怪的是,如果我把它分成两个函数,比如
def insAllS(values: MyRdt*)(session: Session) {
MyTable.insertAll(values: _*)(session)
}
def insAll(values: MyRdt*) {
Db.withTransaction(session => {
insAllS(values: _*)(session)
})
}
它编译没有错误。
PS:MyRdt
是表记录元组的类型别名。
答案 0 :(得分:1)
在途中是较少类型安全(运行时)会话处理程序;如果你有范围threadLocalSession,那么以下应该工作:
import org.scalaquery.session.Database.threadLocalSession
def insAll(values: MyRdt*) {
Db.withTransaction { implicit ss: session =>
MyTable.insertAll(values: _*)
}
}
但是,就回答你的问题而言:编译时会话处理程序,假设你已经尝试指定传递给块的类型是Session:
import org.scalaquery.session._
def insertAll(values: MyRdt*) {
Db.withTransaction { ss: Session =>
Foo.insertAll(values: _*)(ss)
}
}
答案 1 :(得分:1)
超载是罪魁祸首。签名类似于withTransaction
方法:
scala> def om[T](f: Int => T): T = f(0)
om: [T](f: (Int) => T)T
scala> def om[T](f: => T): T = f
om: [T](f: => T)T
scala> om(x => 'x)
<console>:80: error: missing parameter type
om(x => 'x)
^
scala> def m[T](f: Int => T): T = f(0)
m: [T](f: (Int) => T)T
scala> m(x => 'x)
res46: Symbol = 'x