如果您想要类(class),仍然需要使用宏(macro)。
class SomeClass1 extends SomeClass with SomeTrait
将自动生成。
我检查了一下,宏仍然可以使用(稍作修改)
def toPersisted[T](instance: T, id: Long): T with Persisted = macro impl[T]
def impl[T: c.WeakTypeTag](c: blackbox.Context)(instance: c.Tree, id: c.Tree): c.Tree = {
import c.universe._
val typ = weakTypeOf[T]
val symbol = typ.typeSymbol
if (!symbol.asClass.isCaseClass)
c.abort(c.enclosingPosition, s"toPersisted only accepts case classes, you provided $typ")
val accessors = typ.members.sorted.collect { case x: TermSymbol if x.isCaseAccessor && x.isMethod => x }
val fieldNames = accessors map (_.name)
val instanceParam = q"val instance: $typ"
val idParam = q"${Modifiers(Flag.PARAMACCESSOR)} val id: Long"
val superArgs = fieldNames map (fieldName => q"instance.$fieldName")
val ctor =
q"""def ${termNames.CONSTRUCTOR}($instanceParam, $idParam) = {
super.${termNames.CONSTRUCTOR}(..$superArgs)
()
}"""
val idVal = idParam.duplicate
val tmpl = Template(List(tq"$typ", tq"Persisted"), noSelfType, List(idVal, ctor))
val cname = TypeName(c.freshName(symbol.name.toString + "$Persisted"))
val cdef = ClassDef(NoMods, cname, Nil, tmpl)
q"""
$cdef
new $cname($instance, $id)
"""
}
case class MyClass(i: Int, s: String)
val x = MyClass(1, "a")
val y = toPersisted(x, 2L)
y.i
y.s
y.id
(new Organism).addWings()
会产生一个有翅膀的生物
对象,而(new Organism).addWings().addLegs()
则会产生一个有翅膀和腿的生物
对象。为了避免疑义,Wings
和Legs
都是特质。)这个功能将允许像makeItFly(Organism with Wings)
这样的函数接受两个输入:1)一个带有翅膀的生物对象和2)一个带有翅膀和腿的生物对象。 - xyz2006tormakeItFly
的主体,以确保它“具备运行所需的一切”,并进行该检查。 - xyz2006tormakeItFly
中)。 - xyz2006tor