2012-08-03 11 views
8

Moje zadanie polega na znalezieniu nazw parametrów klasy case, dla których istnieją wartości domyślne.Jak sprawdzić, które parametry klasy case mają wartość domyślną za pomocą scala reflection 2.10

W 2,9 używałem ScalaSigParser z scalap i zrobił coś podobnego do:

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

miałem nadzieję, że odbicie w 2,10 dałby mi łatwiejszy dostęp do tego rodzaju informacji.

Ostatecznie chciałbym napisać makro, które powinienem dołączyć do obiektu towarzyszącego "obiekt towarzyszący", który automatycznie tworzy kod do serializacji/deserializacji tej klasy sprawy. Aby to zrobić, muszę wiedzieć, które parametry mają wartości domyślne.

Odpowiedz

3

Obecnie nie ma sposobu, aby to zrobić, jednak właśnie wysłałem żądanie ściągnięcia (https://github.com/scala/scala/pull/1047), które dodaje TermSymbol.isDefaultParam, które ujawnia żądaną funkcjonalność. Mam nadzieję, że trafi on do RC1 i 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

Niesamowite, dzięki! –

+0

Wszechstronne polecenie ściągnięcia zostało scalone i zostanie włączone do wersji 2.10.0. –

+1

Wygląda na to, że 'params' jest teraz' paramss', a metoda 'isDefaultParam' ma zmienioną nazwę na' isParamWithDefault' zarówno w scala 2.10 jak i 2.11 – lyomi

Powiązane problemy