如何使用Scala-Macros获取构造函数参数名称

mgo*_*nto 5 reflection macros constructor scala scala-macros

有没有办法使用scala-macros获取给定构造函数的参数名称?

谢谢

Tra*_*own 5

请注意,:powerPaul Butcher的答案中的方法允许您访问内部API,如果您尝试在宏中执行此操作(或者在REPL之外的运行时反射中),这可能不是必需的或期望的.

因此,例如调用公共Reflection API 提供isConstructor的普通旧版本将不起作用 - 您首先需要确保您拥有.与之相似.您当然可以使用非REPL代码转换为内部API,但这很危险且不必要.以下是更好的解决方案:SymbolmembersMethodSymboltpe

import scala.reflect.runtime.universe._

class Foo(name: String, i: Int) { def this(name: String) = this(name, 0) }

typeOf[Foo].declaration(nme.CONSTRUCTOR).asTerm.alternatives.collect {
  case m: MethodSymbol => m.paramss.map(_.map(_.name))
}
Run Code Online (Sandbox Code Playgroud)

要不就:

typeOf[Foo].declarations.collect {
  case m: MethodSymbol if m.isConstructor => m.paramss.map(_.map(_.name))
}
Run Code Online (Sandbox Code Playgroud)

这两个都会给你以下内容:

List(List(List(name, i)), List(List(name)))
Run Code Online (Sandbox Code Playgroud)

如预期的.我在这里使用了运行时反射来简化示例,但是这将与UniverseContext在宏中获得的方式完全相同.