2012-07-01 136 views
6

我試圖從另一個問題的榜樣,而我來到東西反射奇怪的行爲,我無法解釋:在斯卡拉

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

@Antoras自從一些Scala代碼讓我迷惑其含義以來,它已經有很長一段時間了。解釋是相當明顯的,但將「ToolBox」作爲一種方法的想法確實沒有發生在我身上。 –

3

ToolBox是隱式類,皮條客mkToolBoxMirror。與Eval同樣的故事,皮條客eval

+0

隱式類?這當然解釋了非傳統的命名方法。 –