是否可以在Scala表達式中添加一些魔術構造,以便在編譯期間打印類型?例如。有一些類,魔術功能,元編程類型,它具有:編譯時間類型跟蹤
val i = 1
Some(11).map(Trace(_ + 1))
// compile
// prints: Int
是否可以在Scala表達式中添加一些魔術構造,以便在編譯期間打印類型?例如。有一些類,魔術功能,元編程類型,它具有:編譯時間類型跟蹤
val i = 1
Some(11).map(Trace(_ + 1))
// compile
// prints: Int
不完全是,但如何「布特這個
$ cat Test.scala
def Trace[T] = identity[T] _
val i = 1
Some(11) map {x => Trace(x + 1)}
$ scala -Xprint:typer Test.scala 2>&1 | egrep --o 'Trace\[.*\]'
Trace[T >: Nothing <: Any]
Trace[Int]
第一個跟蹤來自跟蹤的定義,可以忽略不計。相同的參數(-Xprint:typer)也適用於scalac。
不,沒有這樣的事情。編譯器插件可能能夠做到這一點。
像這樣的事情會在運行工作
def Type[T](x:T):T = {println(x.asInstanceOf[AnyRef].getClass()); x }
如果事情變得很討厭的,你可以使用這個:
scala -Xprint:typer -Xprint-types
獲取難讀,而是告訴編譯器你到底是什麼正在思考。
你確定要打印`Int`而不是`Option [Int]`嗎? – 2011-02-14 13:14:27
是的,`_ + 1`的類型應該是`Int`。 – Debilski 2011-02-14 13:16:13