我正在尝试概括设置 Squeryl(Slick 提出了同样的问题 AFAIK)。我想避免必须为许多通用方法显式命名每个案例类。
table[Person]
table[Bookmark]
etc.
这也适用于生成索引,并为每个案例类围绕 CRUD 方法创建包装器方法。
所以理想情况下我想做的是有一个类列表并将它们制作成表,添加索引并添加一个包装器方法:
val listOfClasses = List(classOf[Person], classOf[Bookmark])
listOfClasses.foreach(clazz => {
val tbl = table[clazz]
tbl.id is indexed
etc.
})
我认为 Scala 宏将适用于此处,因为我认为您不能将值作为类型参数。我还需要为每种类型的表单生成方法:
def insert(model: Person): Person = persons.insert(model)
我对宏的示例有所了解,但我不知道如何生成通用数据结构。
我得到了这个简单的例子来说明我想要什么:
def makeList_impl(c: Context)(clazz: c.Expr[Class[_]]): c.Expr[Unit] = {
import c.universe._
reify {
println(List[clazz.splice]()) // ERROR: error: type splice is not a member of c.Expr[Class[_]]
}
}
def makeList(clazz: Class[_]): Unit = macro makeList_impl
我该怎么做呢?还是 Scala 宏是错误的工具?