如何使用Scala反射获取符号的值?

时间:2019-04-25 11:43:09

标签: scala reflection

使用Scala反射,您可以获取AST中某些元素的值。例如,当我想在AST中获取某些String的值时,可以使用以下语句,该语句工作得很好:

a.tree.children.tail.collect({case Literal(Constant(id: String)) => id}).head

但是,当我要访问的值是scala.Symbol而不是String时,上面的语句不会返回该值:

a.tree.children.tail.collect({case Literal(Constant(id: Symbol)) => id}).head

我的问题:scala.Symbol似乎不是AST中的文字常量吗?

1 个答案:

答案 0 :(得分:3)

您可以打印树木

import scala.reflect.runtime.universe._

println(showRaw(reify {
  "aaa"
}.tree)) // Literal(Constant("aaa"))

println(showRaw(reify {
  'aaa
}.tree)) 
// Apply(Select(Ident(scala.Symbol), TermName("apply")), List(Literal(Constant("aaa"))))

尝试

case q"Symbol.apply(${Literal(Constant(id: String))})" => id

case Apply(Select(Ident(TermName("Symbol")), TermName("apply")), List(Literal(Constant(id: String)))) => id

您可以查看它们如何与Shapeless中的Symbol s一起使用

https://github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/singletons.scala#L142-L146