1

假设我有如下方法:

def getInfo(func: () => T) = {
  //Code goes here.
}

如何使用 Scala 2.11.1 的运行时反射来检查传递的匿名函数func

我对获取 AST(抽象语法树)特别感兴趣func,如果可能的话,获取首次定义该方法的位置(行号、文件)。到目前为止,我所做的只是获取有关参数类型的信息func,而不是函数本身。

我知道在 SO 上也有类似的问题,但它们主要针对其他 Scala 版本。

4

1 回答 1

1

正如 Ben 在评论中提到的,这可以在编译时使用 Scala 宏来完成。

一种可能的选择是将原始调用扩展为查询必要信息的宏,然后调用内部 getInfoMethod,该方法对信息进行处理。

函数示例getInfo

import scala.language.experimental.macros
//getInfo method which gets expanded to macro
def getInfo(func: => Any):Unit = macro FindFreeVars.findMacro

def getInfoInternal(info: Any) {
   //Do something with the collected information
}

宏示例:

//Macro delclaration
def getInfoMacro(c: Context)(func: c.Tree): c.Expr[Unit] = {
    import c.universe._

    //Extract information, like enclosingPosition or symols from the function tree. 
    val functionInfo = getFunctionInfo(func)

    //Call internal method
    c.Expr[List[(String, Any)]](q"getInfoInternal($func, $closedVars)")
}

更多关于符号、树和类型的分析。

一个更完整的宏示例,它通过应用相同的技术来查找从函数中的另一个范围绑定的所有变量。

于 2014-08-14T19:53:33.353 回答