2009-11-30 33 views
4

當試圖確定一個庫的工作方式時,隱式轉換是令人困惑的。例如,查看像'val foo:Foo = 1'這樣的表達式,將1轉換爲Foo?scala:追蹤implicits選擇和其他代碼魔法

是否有可能指示階庫(或REPL)打印出被同時計算表達式執行代碼路徑?

回答

7

您可以添加「-Xprint:打字員」的編譯器命令行(或「-Ybrowse:打字員」的Swing GUI的瀏覽器)來查看代碼與顯式應用的轉換。

+0

你所說的Swing GUI的瀏覽器意思? – 2011-12-04 16:35:22

+0

Swing = java客戶端GUI小部件。 GUI =圖形用戶界面。 「Swing GUI Browser」=醜陋的對話框,裏面有可擴展的樹形控件。 (1)關於 – 2011-12-20 21:11:44

3

作爲替代打印出的轉換,人們必須意識到implicits不能剛出來的藍色。你必須以某種方式將它們納入範圍。替代方案是:

  1. 明確import聲明。當y是一個對象時,請注意import x.y._,因爲這是將隱式引入到範圍中的唯一方法。
  2. 正在轉換爲其他內容的類的對象伴侶。
  3. 目標類的對象伴隨,只要該目標以某種方式明確(例如在您的示例中)。

請注意,對象scala.Predef默認情況下都會導入到作用域中,這是Scala默認含義進入作用域的方式。

+0

。實際上,這個問題源於這樣一個事實,即使用scalacheck你可以導入org.scalacheck._,然後你可以做一些事情,比如「val vowel:Gen [Char] ='A'|'E'|'I'|' O'|'U'|'Y'「,這顯然使用隱式轉換。事實證明,其中一個scalacheck文件具有「導入Gen. {value,...}」(值是執行轉換的隱式方法) – IttayD 2009-11-30 17:03:57

+0

我懷疑import是否是相關的。在這種情況下,我會查看Gen的對象伴侶。 – 2009-12-01 10:54:32

+0

是的,來自同伴對象,但我不需要執行'import org.scalacheck.Gen._'來獲取它,因此隱式導入隱式完成(雙關意圖) – IttayD 2009-12-01 11:17:46

0

scalac -print打印在施加隱式類型轉換後的代碼。

class A{ 
    val x : String = "hi" drop 1 
} 

會導致:

package <empty> { 
    class A extends java.lang.Object with ScalaObject { 
    @remote def $tag(): Int = scala.ScalaObject$class.$tag(A.this); 
    private[this] val x: java.lang.String = _; 
    <stable> <accessor> def x(): java.lang.String = A.this.x; 
    def this(): A = { 
     A.super.this(); 
     A.this.x = scala.this.Predef.forceRandomAccessCharSeq(
     scala.this.Predef.stringWrapper("hi").drop(1)); 
    () 
    } 
    } 
}