2012-04-18 9 views
2

このコード:ScalaQueryの "withTransaction"句でテーブルにアクセスすると、 "Missing parameter type"が表示されるのはなぜですか?

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) 
    }) 
} 

のような2つの機能にそれを分割している場合

不思議なことに、それはエラーなしでコンパイルされます。

PS:MyRdtは、テーブルレコードタプルのタイプエイリアスです。

答えて

1

途中で型保証されていない(ランタイム)セッションハンドラです。限り、あなたの質問の再に答えるように、しかし

import org.scalaquery.session.Database.threadLocalSession 

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

を:あなたは、スコープthreadLocalSessionを持っている場合は、次のように動作するはずの時間のセッションハンドラをコンパイルし、あなたがブロックに渡されたタイプがセッションであることを指定しようとしていると仮定します。

import org.scalaquery.session._ 

def insertAll(values: MyRdt*) { 
    Db.withTransaction { ss: Session => 
    Foo.insertAll(values: _*)(ss) 
    } 
} 
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 
関連する問題