2011-01-02 9 views
18

Es un hecho bien conocido que los tipos estructurales se implementan a través de la reflexión. ¿Hay quizás otros constructos de lenguaje que usen la reflexión?¿Qué funciones de Scala se implementan internamente utilizando la reflexión?

+0

¡Gracias a todos por sus respuestas! No estoy seguro de qué hacer en este punto. No sería justo aceptar uno solo en este caso, pero tampoco es posible aceptar varios de ellos. –

+0

acepta el que se refiere a los objetos anónimos porque es el único (aparte de los tipos estructurales en general) donde la reflexión puede provocar graves problemas de rendimiento. (Tal vez soy solo yo, pero no puedo dejar una de mis preguntas sin una respuesta aceptada). –

Respuesta

15

Esto está estrechamente relacionado con los tipos estructurales, pero cualquier instancia de objeto anónima, es decir

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

utilizará la reflexión.

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

+4

+1: Esto tiene implicaciones al definir conversiones implícitas, por lo que vale la pena señalarlo por separado. En resumen, siempre defina una clase * nombrada * fuera de la función 'implícita', y defina una función implícita * separada * para convertirla a esa clase. –

+0

Esto es exactamente lo que hago cuando defino una conversión implícita para agregar un método a una clase - hora para cambiar. – Russell

5

Si se tiene en cuenta isInstanceOf/asInstanceOf como la reflexión, a continuación, la coincidencia de patrones se basa en ellos

+1

Eso no es reflejo, es verificación de tipo y lanzamiento, y es muy rápido. – vadipp

+0

@vadipp - sí, parece que no deberíamos tener miedo de usarlo cada vez que nos inclinemos a hacerlo: http://stackoverflow.com/questions/103564/the-performance-impact-of-using-instanceof-in- java – bbarker

1

No es una construcción del lenguaje, pero ScalaTest incluye Suite.execute, que utiliza la reflexión para encontrar y llamar a los métodos de prueba.

¿El modelo pattern matching de Scala utiliza alguna reflexión detrás de escena?

+0

Afaik, la coincidencia de patrones usa solo métodos de comprobación de tipo, tipo de fundición y "de aplicación". Para las clases de biblioteca estándar, el compilador también puede generar conmutadores JVM nativos, construcciones 'if-else' y demás. La reflexión no es necesaria aquí. – vadipp

+0

_¿Qué es el tipo de verificación, realmente? – matanster

5

Método de invocación en los tipos estructurales depende de la reflexión:

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

OP mencionó específicamente tipos estructurales y solicitó otros ejemplos. –

+0

@pelotom: aviso OP también es Ken Bloom. – IttayD

+0

@IttayD: ¿Eh? OP es @Nermin Serifovic –

10

enumeraciones utilizar la reflexión para averiguar acerca de todos los valores posibles para la enumeración de la función nameOf. (Consulte el método populateNameMap en Enumeration.scala). Esto se hace una vez, la primera vez que llama al nameOf para un tipo particular de Enumeration.

2

El intérprete Scala hace un uso muy intensivo de reflexión.

Cuestiones relacionadas