Странное поведение с отражением в 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] = scala.tools.reflect.ToolBoxFactory$ToolBoxImpl@225765b0

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

2 ответа

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

Если я рассмотрю это с 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 для компилятора не показывают ничего, кроме черты на левой стороне, если вы посмотрите на пакет, вы увидите неявное определение метода.

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

Другие вопросы по тегам