2012-07-01 8 views
6

Я пытался последовать примеру другого вопроса, и я пришел на то, что я не могу объяснить:Странное поведение с отражением в 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] 

Каким mkToolBox не является членом m перед импортом ToolBox, но после?

ответ

2

Если я исследую его reify, я вижу это:

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) 
} 

Это означает, что есть способ вызова функции с именем ToolBox внутри объекта пакета scala.tools.reflect. Это не объект, потому что reify выставляет метод apply.

Итак, несмотря на то, что API Docs for the Compiler не показывают ничего, кроме черты с левой стороны, если вы посмотрите на пакет, вы увидите неявное определение метода.

PS: Да, это был настоящий вопрос. Мне не приходило в голову мысль о старшем методе с тем же именем признака, пока я не подумал о том, чтобы оформить вещь, чтобы получить дерево.

+0

Что я делаю в таких ситуациях: я смотрю на источники, чтобы узнать, что там происходит. ;) – sschaef

+0

@ Анторы Прошло много времени, так как какой-то код Скалы оставил меня в замешательстве относительно его значения. Объяснение довольно очевидно, но думать о «ToolBox» как методе действительно не приходило мне в голову. –

3

ToolBox - неявный класс, который сутенеры mkToolBox на Mirror. Та же история с Eval, которые сутенеры eval.

+0

Неявный класс? Это, безусловно, объясняет нетрадиционно названный метод. –

Смежные вопросы