我们有一个特质,在其中包含一个execute[T <: Record](Seq[(Session) => T]): Seq[T]
方法,其中Record
是我们从数据库检索的所有特质的超特质。
trait DbTrait {
val threadCount: Int
val db: Database
protected def getGroupSize(size: Int, threadCount: Int) {
(size / threadCount) + if(size % threadCount == 0) 0 else 1
}
def execute[T <: Record](funs: Seq[(Session) => T]): Seq[T]
}
trait DbTraitSingle extends DbTrait {
val threadCount = 1
def execute[T <: Record](funs: Seq[(Session) => T]): Seq[T] =
db.withSession{session: Session => funs.map(f => f(session))}
}
trait DbTraitMulti extends DbTrait {
val threadCount = 4
def execute[T <: Record](funs: Seq[(Session) => T): Seq[T] =
funs.grouped(getGroupSize(funs.size, threadCount)).map(funs => Future {
db.withSession{session: Session => funs.map(f => f(session))}
}.toList.flatten
}
等等。理想情况下,我们希望能够创建类似于
的东西。def executePoly2[T1 <: Record, T2 <: Record]
(tuple: Tuple2[(Session) => T1, (Session) => T2]): Tuple2[T1, T2]
对于任意的元组(例如executePoly3、executePoly4等),但存在两个问题:
- 有没有办法减少样板代码的量,或者我们将被迫创建22个不同的方法签名?
- 是否有一种类型安全的方式来拆分元组,类似于seq.grouped方法调用,或者我们被困在为所有不同的threadCount值(目前不超过4)编写特殊情况的境地中?
Set~>Option
,而我需要像Session~>T
这样的东西,其中Session
是不变类型,但我很难找到一个具有裸T
的多态函数的示例——它们都包装在Option
或Set
等中。 - Zim-Zam O'Pootertoot