2012-07-01 23 views
6

yo estaba tratando de seguir el ejemplo de otra pregunta, y me encontré con algo que no puedo explicar:Comportamiento extraño con la reflexión en Scala

scala> import scala.reflect.runtime.{currentMirror => m} 
import scala.reflect.runtime.{currentMirror=>m} 

scala> m.mkToolBox() 
<console>:12: error: value mkToolBox is not a member of reflect.runtime.universe.Mirror 
       m.mkToolBox() 
       ^

scala> import scala.tools.reflect.ToolBox 
import scala.tools.reflect.ToolBox 

scala> m.mkToolBox() 
res3: scala.tools.reflect.ToolBox[reflect.runtime.universe.type] = [email protected] 

¿Cómo es que mkToolBox no es miembro de m antes de importar ToolBox, pero es después?

Respuesta

2

Si examino con reify, veo esto:

scala> reify{ m.mkToolBox() }.tree 
res4: reflect.runtime.universe.Tree = 
{ 
    val qual$1 = scala.tools.reflect.`package`.ToolBox(scala.reflect.runtime.`package`.m); 
    val x$1 = qual$1.mkToolBox$default$1; 
    val x$2 = qual$1.mkToolBox$default$2; 
    qual$1.mkToolBox(x$1, x$2) 
} 

Eso significa que hay una llamada de método a una función llamada ToolBox dentro del objeto de paquete scala.tools.reflect. No es un objeto, porque reify expone el método apply.

Por lo tanto, aunque el API Docs for the Compiler no muestra nada más que el rasgo en el lado izquierdo, si nos fijamos en el paquete, verá una definición de método implícito.

PS: Sí, esto era una pregunta real. La idea de un método de inicio en mayúsculas con el mismo nombre de un rasgo no se me ocurrió, hasta que pensé en reificar el objeto para obtener el árbol.

+0

Lo que hago en este tipo de situaciones: Miro a las fuentes de reconocer lo que está pasando allí. ;) – sschaef

+0

@Antoras Ha pasado mucho tiempo desde que algún código de Scala me dejó perplejo en cuanto a su significado. La explicación es bastante obvia, pero pensar en 'ToolBox' como método realmente no se me ocurrió. –

3

ToolBox es una clase implícita que proxenetas mkToolBox en Mirror. La misma historia con Eval, que proxenetas eval.

+0

¿Una clase implícita? Eso sin duda explica el método no convencionalmente nombrado. –