是否可以在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