import scala.annotation.{StaticAnnotation, compileTimeOnly}
import scala.language.experimental.macros
import scala.reflect.macros.blackbox
@compileTimeOnly("enable macro annotations")
class generateVariables(names: String*) extends StaticAnnotation {
def macroTransform(annottees: Any*): Any = macro GenerateVariablesMacro.impl
}
object GenerateVariablesMacro {
def impl(c: blackbox.Context)(annottees: c.Tree*): c.Tree = {
import c.universe._
val names = c.prefix.tree match {
case q"new generateVariables(..$ns)" => ns
}
val variables = names.map { case q"${name: String}" =>
q"""val ${TermName(name)} = notebook.filter(${s"Name='$name'"}).select("Location")"""
}
annottees match {
case q"$mods object $tname extends { ..$earlydefns } with ..$parents { $self => ..$body }" :: Nil =>
q"""$mods object $tname extends { ..$earlydefns } with ..$parents { $self =>
..$variables
..$body
}"""
}
}
}
用法:
@generateVariables("A", "B", "C")
object X
//scalac: object X extends scala.AnyRef {
// def <init>() = {
// super.<init>();
// ()
// };
// val A = notebook.filter("Name=\'A\'").select("Location");
// val B = notebook.filter("Name=\'B\'").select("Location");
// val C = notebook.filter("Name=\'C\'").select("Location")
//}
现在可以使用变量了 X.A , X.B , X.C (或者如果你 import X._ 那就 A , B , C ).
1条答案
按热度按时间bq3bfh9z1#
可以创建变量列表
或
并使用变量(
val
秒)e1
,e2
,e3
或者es(0)
,es(1)
,es(2)
.我希望变量的值与name的值相同。我想在代码的其他部分使用tht变量
然后可以使用宏注解
用法:
现在可以使用变量了
X.A
,X.B
,X.C
(或者如果你import X._
那就A
,B
,C
).