2010-07-05 18 views
21

通常沒有必要理會在Scala中隱含參數,但有時它是非常有幫助瞭解如何編譯器會自動爲他們提供。不幸的是,這種理解似乎很難獲得!有沒有一種系統的方法來發現哪些隱含的defs在範圍內,哪一個被綁定在某個特定的點上?

有沒有一種通用的方法來發現在給定的代碼片段中隱式參數是如何提供的?

理想情況下,有一天IDE集成將以某種方式提供這些信息,但我期望現在我不得不深入挖掘。有什麼方法可以讓編譯器準確解釋它在任何給定點上選擇的隱式定義?這可以從其他編譯器輸出間接解密嗎?

舉個例子,我想知道如何計算出我自己在implicit bf: CanBuildFrom[Repr, B, That]參數TraversableLike.map從何而來,不讀像this one堆棧溢出的問題!

回答

14
  1. 將選項-Xprint:typer添加到scalac命令行。這會在typer編譯器階段之後打印程序樹。這對於一個簡短的,自包含的示例來說效果最好。你也可以把它傳遞給scalac。這對於在Scala中實現自力更生非常重要!
  2. 正如蘭德爾所提及的,示出的IntelliJ在範圍內和所選擇的隱觀與CTRL-ALT-SHIFT-I。等一兩個月,隱含的論據可能會有類似的支持。
+0

不應該打字員階段提供AST甚至推斷出的類型信息時,scalac確實隱含的分辨率是多少? http://stackoverflow.com/q/27468053/306488。 – lisak 2014-12-14 11:15:48

7

理想的情況下,有一天IDE集成將提供以某種方式這個信息,...

那一天就是今天與JetBrains公司的想法。如果使用最近晚上發佈的Scala插件運行IDEA版本9(9.0.3 EA#95.289)的最新EAP,則此功能存在。可以選擇每個值表達式,併發出一個命令,顯示一個彈出窗口,顯示所有適用的隱式轉換,其中編譯器將選擇突出顯示的轉換。

而且,因爲有明顯的幾個在那裏誰還不知道呢,有一個免費和開源社區版IDEA和它支持的Scala插件。

相關問題