在scala中动态创建变量

daolsyd0  于 2021-05-26  发布在  Spark
关注(0)|答案(1)|浏览(587)

我有一张单子 w: List[Any] = List(A, B, C) 我想动态地创建一个变量

for (e <- w) {

        //val $e = notebook.filter(s"Name='$e'").select("Location")
        println(e)
      }

所以三个变量a,b,c应该用它们相应的位置值来创建。
谢谢您的帮助

bq3bfh9z

bq3bfh9z1#

可以创建变量列表

val List(e1, e2, e3) = w.map { e =>
  println(e)
  notebook.filter(s"Name='$e'").select("Location")
}

val es = w.map { e =>
  println(e)
  notebook.filter(s"Name='$e'").select("Location")
}

并使用变量( val 秒) e1 , e2 , e3 或者 es(0) , es(1) , es(2) .
我希望变量的值与name的值相同。我想在代码的其他部分使用tht变量
然后可以使用宏注解

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

相关问题