2012-08-03 55 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

相關問題