首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Scala-Macros获取构造函数参数名称

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

Stack Overflow用户
提问于 2012-12-11 13:39:55
回答 2查看 2.6K关注 0票数 5

有没有办法使用scala宏来获取给定构造器的参数名?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-11 20:59:10

请注意,Paul Butcher的答案中的:power方法为您提供了对内部API的访问,如果您试图在宏中执行此操作(或者在REPL之外的运行时反射中,就这一点而言),则可能不需要或不希望这样做。

因此,例如,在公共反射API中调用members提供的普通旧式Symbol上的isConstructor将不起作用-您首先需要确保您有一个MethodSymboltpe也是如此。当然,您可以在非REPL代码中强制转换为内部API,但这是危险的,也是不必要的。下面是一个更好的解决方案:

代码语言:javascript
复制
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))
}

或者只是:

代码语言:javascript
复制
typeOf[Foo].declarations.collect {
  case m: MethodSymbol if m.isConstructor => m.paramss.map(_.map(_.name))
}

这两个工具都将为您提供以下功能:

代码语言:javascript
复制
List(List(List(name, i)), List(List(name)))

如你所愿。我在这里使用了运行时反射来简化示例,但它的工作方式与您在宏中从Context获得的Universe完全相同。

票数 5
EN

Stack Overflow用户

发布于 2012-12-11 18:10:55

我希望这篇REPL成绩单能让你振作起来:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13814288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档