1
我试图为接受case类值的函数生成Tree
,并返回给定位置的case类参数值。这对提取私有参数的值很有用。在插入字符串之前插入字符串(运行时quasiquote?)
import reflect.runtime.currentMirror
import scala.reflect.runtime.universe._
import scala.tools.reflect.ToolBox
val tb = currentMirror.mkToolBox()
case class A(private val first: Int)
case class B(first: Int, private val second: Int)
def get(tpe: Type, position: Option[Int]): Tree = {
val pos = s"${position.map(p => s"._${p + 1}").getOrElse("")}"
tb.parse(s"(a: $tpe) => $tpe.unapply(a).get$pos")
}
println(tb.eval(get(typeOf[A], None)).asInstanceOf[(A) => Int](A(1)))
println(tb.eval(get(typeOf[B], Some(1))).asInstanceOf[(B) => Int](B(1, 2)))
此外,我加入以下相关:
scalaVersion := "2.11.8"
libraryDependencies ++= Seq(
"org.scala-lang" % "scala-reflect" % scalaVersion.value,
"org.scala-lang" % "scala-compiler" % scalaVersion.value
)
position
是None
当壳体类只有一个参数。
我的解决方案的工作,但我怎么能摆脱tb.parse(s"...")
和与quasiquoteq"..."
更换呢?
我试过,但它失败:
Don't know how to unquote here
[error] q"(a: $tpe) => $tpe.unapply(a).get$pos"
[error] ^
当我明白我不能插入成在运行时被构建和q"..."
在编译时解析不像tb.parse
quasiquote一些字符串。 对吗?
也可以像那样插入s"(a: $tpe) => $tpe.unapply(a).get$pos"
?当使用q"..."
语法时,quasiquote知道$tpe
是Type
,但字符串插值会从中产生字符串。我不确定这是否会始终工作,在更复杂和特殊的情况下。
我错过了'Select'。有没有关于这方面的详细文档? – mixel
http://scala-lang.org/api/current/scala-reflect。 'Select'是'x.y'中的'.'。 – HTNW