當試圖確定一個庫的工作方式時,隱式轉換是令人困惑的。例如,查看像'val foo:Foo = 1'這樣的表達式,將1轉換爲Foo?scala:追蹤implicits選擇和其他代碼魔法
是否有可能指示階庫(或REPL)打印出被同時計算表達式執行代碼路徑?
當試圖確定一個庫的工作方式時,隱式轉換是令人困惑的。例如,查看像'val foo:Foo = 1'這樣的表達式,將1轉換爲Foo?scala:追蹤implicits選擇和其他代碼魔法
是否有可能指示階庫(或REPL)打印出被同時計算表達式執行代碼路徑?
您可以添加「-Xprint:打字員」的編譯器命令行(或「-Ybrowse:打字員」的Swing GUI的瀏覽器)來查看代碼與顯式應用的轉換。
作爲替代打印出的轉換,人們必須意識到implicits不能剛出來的藍色。你必須以某種方式將它們納入範圍。替代方案是:
import
聲明。當y
是一個對象時,請注意import x.y._
,因爲這是將隱式引入到範圍中的唯一方法。請注意,對象scala.Predef
默認情況下都會導入到作用域中,這是Scala默認含義進入作用域的方式。
。實際上,這個問題源於這樣一個事實,即使用scalacheck你可以導入org.scalacheck._,然後你可以做一些事情,比如「val vowel:Gen [Char] ='A'|'E'|'I'|' O'|'U'|'Y'「,這顯然使用隱式轉換。事實證明,其中一個scalacheck文件具有「導入Gen. {value,...}」(值是執行轉換的隱式方法) – IttayD 2009-11-30 17:03:57
我懷疑import是否是相關的。在這種情況下,我會查看Gen的對象伴侶。 – 2009-12-01 10:54:32
是的,來自同伴對象,但我不需要執行'import org.scalacheck.Gen._'來獲取它,因此隱式導入隱式完成(雙關意圖) – IttayD 2009-12-01 11:17:46
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));
()
}
}
}
你所說的Swing GUI的瀏覽器意思? – 2011-12-04 16:35:22
Swing = java客戶端GUI小部件。 GUI =圖形用戶界面。 「Swing GUI Browser」=醜陋的對話框,裏面有可擴展的樹形控件。 (1)關於 – 2011-12-20 21:11:44