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

时间:2012-12-11 05:39:55

标签: scala reflection constructor macros scala-macros

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

由于

2 个答案:

答案 0 :(得分:5)

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

因此,例如,在公共Reflection API中isConstructor提供的普通旧版Symbol上调用members将无效 - 您首先需要确保拥有{{} 1}}。与MethodSymbol类似。您当然可以使用非REPL代码转换为内部API,但这很危险且不必要。以下是更好的解决方案:

tpe

或者只是:

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))
}

这两项都将为您提供以下内容:

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

根据需要。我在这里使用了运行时反射来简化示例,但这与使用宏List(List(List(name, i)), List(List(name))) 中的Universe完全相同。

答案 1 :(得分:1)

这个REPL成绩单应该让你前进,我希望:

Welcome to Scala version 2.10.0-RC5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_09).
Type in expressions to have them evaluated.
Type :help for more information.

scala> :power
** Power User mode enabled - BEEP WHIR GYVE **
** :phase has been set to 'typer'.          **
** scala.tools.nsc._ has been imported      **
** global._, definitions._ also imported    **
** Try  :help, :vals, power.<tab>           **

scala> class Foo(x: Int, y: Float)
defined class Foo

scala> (typeOf[Foo].members find (_.isConstructor)).get.tpe.params map (_.name)
res1: List[$r.intp.global.Symbol#NameType] = List(x, y)