【发布时间】:2015-09-06 03:47:57
【问题描述】:
我有一个函数,想获取它的参数类型和返回类型,以便在 Scala 宏中使用。
scala> val fn = (a: String, b: Double) => 123
fn: (String, Double) => Int = <function2>
scala> fn.getClass
res1: Class[_ <: (String, Double) => Int] = class $anonfun$1
在上面的例子中,参数类型和返回类型已经在两行打印出来了,但我不知道如何访问它们。即使使用toString,我也会被= 符号右侧的<function2> 和class $anonfun$1 部分困住——否则可能会进行一些难看的字符串解析。
我发现MethodSymbolApi 提供了一种为方法提取此信息的方法,但对于这种特殊情况,这似乎没有帮助。
我目前正在研究 AST 解析(作为scala.meta 的一部分)以提取信息,但我认为这个问题似乎足够基本,可以被标准反射库涵盖,尽管我未能在那里找到我想要的东西。有什么想法吗?
根据@johanandren 的回答进行编辑:
我还没有找到一种更简洁的方法来从 TypeTag/Type 中提取它们,但这确实有效。 :)
scala> val fn = (a: String, b: Double) => 123
scala> import scala.reflect.runtime.{universe => ru}
scala> def getTypeTag[T: ru.TypeTag](obj: T) = ru.typeTag[T]
scala> getTypeTag(fn).tpe.toString.split(" => ")
res179: Array[String] = Array((String, Double), Int)
【问题讨论】:
标签: scala reflection anonymous-function scala-macros