2012-08-03 32 views
8

我的任务是查找案例类别的参数名称,其中有缺省值。如何使用scala反射检查案例类别的哪些参数具有默认值2.10

在2.9我用的是从scalap ScalaSigParser并没有类似的东西:

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

我希望在2.10的反射会给我这样的信息更容易获得。

最后,我想编写一个宏,我将包含在case类的伴侣对象中,该对象会自动为该案例类的序列化/反序列化创建一个代码。要做到这一点,我需要知道哪些参数具有默认值。

回答

3

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

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) 
+0

太棒了,谢谢! – 2012-08-05 14:20:41

+0

Allrighty拉取请求已合并,它将包含在2.10.0中。 – 2012-08-06 23:26:10

+1

在scala 2.10和2.11中,似乎'params'现在是'paramss'并且'isDefaultParam'方法被重命名为'isParamWithDefault' – lyomi 2015-01-19 01:42:38

相关问题