编译时类型跟踪

发布于 2024-10-17 07:38:06 字数 162 浏览 3 评论 0原文

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

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

// compile
// prints: Int

Is it possible to add some magic construct around a Scala expression so that it prints the type during compilation? E.g. have some class, magic function, meta programming type, which does:

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

// compile
// prints: Int

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

不喜欢何必死缠烂打 2024-10-24 07:38:06

不完全是,但是这个怎么样

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

Not exactly, but how 'bout this

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

The first Trace comes from the definition of Trace and can be ignored. The same parameter (-Xprint:typer) works with scalac, too.

留蓝 2024-10-24 07:38:06

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

scala -Xprint:typer -Xprint-types

变得很难阅读,但可以准确地告诉你编译器的想法。

If things get really nasty, you can use this:

scala -Xprint:typer -Xprint-types

Gets difficult to read, but tells you exactly what the compiler is thinking.

七七 2024-10-24 07:38:06

像这样的东西将在运行时工作

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

Something like this will work at runtime

def Type[T](x:T):T = {println(x.asInstanceOf[AnyRef].getClass()); x }
鼻尖触碰 2024-10-24 07:38:06

不,没有这样的事情。编译器插件也许能够做到这一点。

No, there's no such thing. A compiler plugin might be able to do it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文