2011-01-02 16 views
18

Jest to dobrze znany fakt, że typy struktur są wdrażane poprzez odbicie. Czy są jakieś inne konstrukcje językowe, które używają refleksji?Które funkcje Scala są wewnętrznie implementowane za pomocą odbicia?

+0

Dziękuję wszystkim za odpowiedzi! Nie jestem naprawdę pewien, co robić w tym momencie. Nie byłoby sprawiedliwe, aby przyjąć jedną w tym przypadku, ale nie można również zaakceptować wielu z nich. –

+0

zaakceptuj ten dotyczący anonimowych obiektów, ponieważ jest to jedyny (poza typami strukturalnymi w ogóle), w którym odbicie może spowodować poważne problemy z wydajnością. (Może to tylko ja, ale nie mogę zostawić jednego z moich pytań bez zaakceptowanej odpowiedzi.) –

Odpowiedz

15

ta jest ściśle związana z typów konstrukcyjnych, ale każdy anonimowy obiekt instancji, tj

new { def print = ("hello world") }.print 

użyje refleksji.

http://scala-programming-language.1934581.n4.nabble.com/Structural-types-reflection-td3071599.html

+4

+1: Ma to wpływ na definicję niejawnych konwersji, więc warto to wskazać osobno. W skrócie, zawsze definiuj * nazwaną * klasę poza funkcją 'implicit' i definiuj * oddzielną * niejawną funkcję do konwersji na tę klasę. –

+0

To jest dokładnie to, co robię, kiedy definiuję niejawną konwersję w celu dodania metody do klasy - czas na zmianę. – Russell

5

Jeśli wziąć pod uwagę isInstanceOf/asInstanceOf jako odbicie, a następnie dopasowanie wzór opiera się na nich

+1

To nie jest odbicie, to jest sprawdzanie i odlewanie typu i jest bardzo szybkie. – vadipp

+0

@vadipp - tak, wygląda na to, że nie powinniśmy bać się go używać, gdy tylko mamy taką ochotę: http://stackoverflow.com/questions/103564/the-performance-impact-of-using-instanceof-in- java – bbarker

1

To nie jest konstruktem język, ale ScalaTest obejmuje Suite.execute, który wykorzystuje odbicia odnaleźć i wywoływać metody testowe.

Czy Scala używa pattern matching jakiejkolwiek refleksji za kulisami?

+0

Afaik, dopasowywanie wzorców używa tylko sprawdzania typu, odlewania typu i metod "unapply". Dla standardowych klas bibliotek kompilator może również generować natywne przełączniki JVM, konstrukcje 'if-else' i inne. Odbicie nie jest tutaj potrzebne. – vadipp

+0

_Co to jest sprawdzanie typu, naprawdę? – matanster

5

Metoda inwokacja typów strukturalnych zależy od refleksji:

type T = { def startsWith(x:String):Boolean } 
def doSomethingWith(x:T) = x.startsWith("abc") 
doSomethingWith("abcdef") 
+2

OP szczegółowo wymienione rodzaje struktur i poprosił o inne przykłady. –

+0

@pelotom: notice OP to także Ken Bloom. – IttayD

+0

@TelayD: Huh? OP to @Nermin Serifovic –

10

Wyliczenia użyć refleksji, aby dowiedzieć się o wszystkich możliwych wartości dla wyliczenia dla funkcji nameOf. (Patrz metoda populateNameMap w). Robi się to raz, po raz pierwszy wywołujesz nameOf dla określonego typu Enumeration.

2

Scala tłumacza sprawia bardzo intensywne użytkowanie refleksji.

Powiązane problemy