编译时间类型跟踪

时间:2011-02-14 13:04:57

标签: scala metaprogramming

是否可以在Scala表达式周围添加一些魔术构造,以便在编译期间打印出类型?例如。有一些类,魔术函数,元编程类型,它有:

val i = 1
Some(11).map(Trace(_ + 1))

// compile
// prints: Int

4 个答案:

答案 0 :(得分:9)

不完全,但是如何'回合

$ 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]

第一个Trace来自Trace的定义,可以忽略。相同的参数(-Xprint:typer)也适用于scalac。

答案 1 :(得分:4)

如果事情变得非常糟糕,你可以使用它:

scala -Xprint:typer -Xprint-types

难以阅读,但确切地告诉您编译器的想法。

答案 2 :(得分:1)

此类内容适用于运行时

def Type[T](x:T):T = {println(x.asInstanceOf[AnyRef].getClass()); x }

答案 3 :(得分:0)

不,没有这样的事情。编译器插件可能能够做到。