2011-09-19 16 views
31

Scala 2.10 przynosi odbicie inne niż dostarczone JVM (lub myślę, że CLR).Jakie możliwości odbicia możemy oczekiwać od Scala 2.10?

Na co w szczególności powinniśmy patrzeć i jak będzie się poprawiać na platformie?

Na przykład, czy będzie istnieć klasa, która odzwierciedla przeliczalność języka między polami i metodami akcesorów, aby można było iterować po właściwościach obiektu?

+3

Odbicie. Popraw ... hmm. –

+0

Hej, naprawdę chcę przykładów - teraz jest nagroda! –

+0

No cóż, wciąż nie ma prawdziwych przykładów, a to pytanie jest teraz największym hitem Google'a dla 'Scala reflection 2.10' Ho hum, @VonC ma to, myślę, ale jeśli ktokolwiek może pokazać mi kod na poziomie użytkownika nadal będę wdzięczny. –

Odpowiedz

14

aktualizacja 2012-07-04:

Daniel SOBRAL (również on SO) szczegóły w swoim blogu "JSON serialization with reflection in Scala! Part 1 - So you want to do reflection?" Niektóre z tych cech pochodzących z refleksji:

Reasumując, Scala 2.10 będzie przyjdź z biblioteką refleksów Scala.
Ta biblioteka jest używana przez sam kompilator, ale jest podzielona na warstwy przez the cake pattern, więc różni użytkownicy widzą różne poziomy szczegółowości, zachowując rozmiary słoików odpowiednie do użytku każdego z nich i, miejmy nadzieję, ukrywając niechciane szczegóły.

Biblioteka refleksyjna również integruje się z nadchodzącymi makro-obiektami, umożliwiając przedsiębiorczym programistom manipulowanie kodem w czasie kompilacji.


aktualizacja 2012-06-14. (od Eugene Burmako):
W Scala 2.10.0-M4, wydaliśmy nową odbicia API że najprawdopodobniej uczynić go 2.10.0 finału bez znaczących zmian.
Więcej szczegółów na temat interfejsu API można znaleźć:

Ekstrakty:

UNIWERSA lustra teraz oddzielne jednostki:

  • światy odbicia gospodarza artefaktów (drzew, symbole typów itp),
  • lusterka streszczenie ładowania tych przedmiotów (np JavaMirror ładuje rzeczy przy użyciu modułu ładującego klasy i modułu do usuwania adnotacji, a narzędzie GlobalMirror używa wewnętrznego kompilatora classreader, aby osiągnąć ten sam cel).

odbicie Publiczne API jest podzielony na scala.reflect.base i scala.reflect.api.

  • Pierwszy z nich reprezentuje minimalistyczną migawkę, która wystarcza do zbudowania reifikowanych drzew i typów na poziomie .
  • Aby zbudować, ale nie analizować, wszystko inteligentne (na przykład uzyskanie podpisu typu) jest zaimplementowane w scala.reflect.api.

obu domenach odbicia mają własny wszechświat: scala.reflect.basis i scala.reflect.runtime.universe.

  • Była to super lekki i nie wymaga żadnych classloaders,
  • natomiast drugi przedstawia uproszczoną kompilatora.

odpowiedź początkowe, wrzesień 2011:

Można zobaczyć ewolucje pakietu odzwierciedlenia w Scala GitHub repo z tych dwóch bardzo niedawnych zobowiązuje:

(Liftcode bytu, według this thread, ma na celu uproszczenie „pisania kodu, który zapisuje kod”)

Klasa scala/reflect/internal/Importers.scala (utworzony wczoraj!) Jest dobrym przykładem wykorzystania najnowszych funkcji tych refleksji.

+0

Oba łącza do zatwierdzeń github już nie istnieją. –

+1

@ om-nom-nom: linki przywrócone. Są teraz dostępne w repozytorium [legacy-svn-scala] (https://github.com/scala/legacy-svn-scala). – VonC

+0

@Eugene: dziękuję za edycję. Pozwoliłem sobie na dodanie kilku linków i odnośników. – VonC

11

dwa linki, które powinny być interesujące:

Osobiście mam nadzieję, że wykorzystam to do runtime odkrycia rozszerzeń (tj. Typu, który rozszerza znaną cechę) i generowania formularzy UI i kilka innych rzeczy z nich.

+0

Dzięki, lista mailingowa prowadzi do wiki - https://wiki.scala-lang.org/display/SIW/Reflection –

+0

, ale wiki nie próbuje destylować wątku. –

+0

i, szczerze mówiąc, wszystko jest dla mnie całkowicie nieprzejrzyste! –

5

Przy obecnym 2.10M4 już można iteracyjne nad członków klasy:

reflect.runtime.universe.typeOf[MyClass].members.filter(!_.isMethod) 

Powyższy kod wymienia Symbol obiekty reprezentujące członków klasy MyClass które nie są metodami. Istnieje mnóstwo sposobów na dostrojenie tego.

Powiązane problemy