【问题标题】:Is there a systematic way to discover which implicit defs are in scope, and which one is bound at a particular point?是否有一种系统的方法来发现哪些隐式定义在范围内,以及哪个在特定点被绑定?
【发布时间】:2010-07-05 12:22:50
【问题描述】:

通常不需要关注 Scala 中的隐式参数,但有时了解编译器如何自动提供它们非常有帮助。不幸的是,这种理解似乎很难获得!

是否有一种通用方法可以发现在给定代码段中是如何提供隐式参数的?

理想情况下,有一天 IDE 集成会以某种方式提供此信息,但我希望现在我必须深入挖掘。有没有办法让编译器准确解释它在任何给定点选择的隐式定义?这可以从其他编译器输出中间接破译吗?

例如,我想知道如何自己解决TraversableLike.mapimplicit bf: CanBuildFrom[Repr, B, That] 参数的来源,而无需阅读Stack Overflow 上的this one 之类的问题!

【问题讨论】:

    标签: debugging compiler-construction scala implicit


    【解决方案1】:
    1. 将选项-Xprint:typer 添加到scalac 命令行。这会在 typer 编译器阶段之后打印程序树。这最适用于一个简短的、自包含的示例。您也可以将其传递给 scalac。这是 Scala 向自力更生迈出的一大步!
    2. 正如 Randall 所述,IntelliJ 显示范围内和选定的隐式视图,CTRL-ALT-SHIFT-I。等待一两个月,隐含的论点可能会有类似的支持。

    【讨论】:

    【解决方案2】:

    理想情况下,有一天 IDE 集成会以某种方式提供此信息,...

    今天就是 JetBrains 的 IDEA。如果您使用最近每晚发布的 Scala 插件运行 IDEA 版本 9 (9.0.3 EA #95.289) 的最新 EAP,则存在此功能。可以选择每个值表达式并发出一个命令,该命令显示一个弹出窗口,显示所有适用的隐式转换,编译器将选择的那个会突出显示。

    因为显然有些人还不知道,所以有一个免费的开源社区版 IDEA,它确实支持 Scala 插件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 2016-03-27
      • 2021-10-03
      • 1970-01-01
      相关资源
      最近更新 更多