2012-08-03 35 views
8

Mi tarea es encontrar los nombres de los parámetros de la clase de caso, para los cuales hay valores predeterminados.Cómo verificar qué parámetros de la clase de caso tienen valor predeterminado utilizando scala reflection 2.10

En 2.9 que estaba usando ScalaSigParser de scalap e hizo algo similar a:

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

Tenía la esperanza de que la reflexión en 2.10 me daría un acceso más fácil a este tipo de información.

Finalmente me gustaría escribir una macro, que incluiría en el objeto complementario de la clase de caso, que crearía automáticamente un código para la serialización/deserialización de esa clase de caso. Para hacer eso, necesito saber qué parámetros tienen valores predeterminados.

Respuesta

3

Actualmente no hay forma de hacerlo, sin embargo, acabo de enviar una solicitud de extracción (https://github.com/scala/scala/pull/1047) que agrega TermSymbol.isDefaultParam, que expone la funcionalidad solicitada. Espero que llegue a RC1 y 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) 
+0

Impresionante, gracias! –

+0

Bien, la solicitud de extracción se ha fusionado y se incluirá en 2.10.0. –

+1

Parece que 'params' ahora es' paramss' y el método 'isDefaultParam' se renombró como' isParamWithDefault' en ambos scala 2.10 y 2.11 – lyomi

Cuestiones relacionadas