scala - 如何使用scala反射2.10检查case类的哪些参数具有默认值

标签 scala reflection macros

我的任务是找到案例类的参数名称,其中有默认值。

在 2.9 中,我使用 scalap 中的 ScalaSigParser 并做了类似的事情:

(...)
case x: MethodSymbol if x.name.startsWith("init$default$") => (...)
(...)

我希望 2.10 中的反射能让我更轻松地访问此类信息。

最终,我想编写一个宏,将其包含在 case 类的伴随对象中,它将自动为该 case 类的序列化/反序列化创建代码。为此,我需要知道哪些参数具有默认值。

最佳答案

目前没有办法做到这一点,但是我刚刚提交了一个拉取请求(https://github.com/scala/scala/pull/1047),其中添加了 TermSymbol.isDefaultParam ,它公开了请求的功能。我希望它能进入 RC1 和 2.10.0-final。

scala> case class C(x: Int, y: Int = 2)
defined class C

scala> val ctor = typeOf[C].declaration(nme.CONSTRUCTOR).asMethod
ctor @ 39fe9830: reflect.runtime.universe.MethodSymbol = constructor C

scala> ctor.params.flatten filter (_.asTerm.isDefaultParam)
res0 @ 7ad2093b: List[reflect.runtime.universe.Symbol] = List(value y)

关于scala - 如何使用scala反射2.10检查case类的哪些参数具有默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11804687/

相关文章:

c# - 如何在不使用 CallerInfo 属性的情况下获取 CallerFilePath 和 CallerLineNumber?

c# - 为 Type.GetMethod 指定输出参数

java - 如何使用反射实例化非公共(public)最终类?

c++ - 通过 pragma 消息打印基于其他宏的定义的数值?

Scala 通用上限

scala - 如何将环境变量传递给 Jenkins 中的 sbt 测试构建步骤?

scala - 密封型参数

scala - DataFrame 分解 JSON 对象列表

c - 在 C 中使用没有值的#define

rust - 为什么在尝试使用外部宏的参数调用内部宏时得到 "unexpected token"?