2

这段代码:

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 => {
                               ^

任何想法为什么?

如果我访问预定义的 Query 而不是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是表记录元组的类型别名。

4

2 回答 2

1

正在进行的是较少类型安全(运行时)的会话处理程序;如果您在范围内有threadLocalSession,那么以下应该可以工作:

import org.scalaquery.session.Database.threadLocalSession

def insAll(values: MyRdt*) {
  Db.withTransaction { implicit ss: session =>
    MyTable.insertAll(values: _*)
  }
}

但是,就回答您的问题而言:编译时会话处理程序,假设您已尝试指定传递给块的类型是会话:

import org.scalaquery.session._

def insertAll(values: MyRdt*) {
  Db.withTransaction { ss: Session =>
    Foo.insertAll(values: _*)(ss)
  }
}
于 2012-04-18T08:02:48.763 回答
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
于 2012-04-18T11:17:41.740 回答