2012-07-01 20 views
6

starałem się śledzić przykład z innym pytaniem, i natknąłem się na coś, czego nie można wyjaśnić:Dziwne zachowanie z odbicia w 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] 

Dlaczego mkToolBox nie jest członkiem m przed importem ToolBox, ale jest później?

Odpowiedz

2

Jeśli zbadam ją reify, widzę to:

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

Oznacza to, że istnieje sposób na wywołanie funkcji o nazwie ToolBox wewnątrz obiektu pakietu scala.tools.reflect. Nie jest to obiekt, ponieważ reify ujawniłby metodę apply.

Tak więc, chociaż API Docs for the Compiler nie pokazuje niczego poza cechą po lewej stronie, jeśli spojrzysz na pakiet, zobaczysz domyślną definicję metody.

PS: Tak, to było prawdziwe pytanie. Myśl o metodzie z wprowadzeniem wielkich liter o tej samej nazwie cechy nie przyszła mi do głowy, dopóki nie pomyślałem o reifikacji rzeczy, by zdobyć drzewo.

+0

Co robię w takich sytuacjach: patrzę na źródła, aby rozpoznać, co się tam dzieje. ;) – sschaef

+0

@Antoras Minęło dużo czasu, odkąd jakiś kod Scala zostawił mnie oszołomiony, jeśli chodzi o jego znaczenie. Wyjaśnienie jest raczej oczywiste, ale myślenie o ToolBoxie jako metodzie naprawdę nie przyszło mi do głowy. –

3

ToolBox to domniemana klasa, która obsługuje mkToolBox na Mirror. Ta sama historia z Eval, której alfabetem jest eval.

+0

Niejawna klasa? To z pewnością wyjaśnia niekonwencjonalnie nazwaną metodę. –