为什么在ScalaQuery中的“withTransaction”子句中访问表时“缺少参数类型”?

时间:2012-04-18 02:39:04

标签: scala scalaquery

此代码:

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是表记录元组的类型别名。

2 个答案:

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