是否有系统的方法来发现哪些隐式defs在范围内,哪一个在特定点绑定?

时间:2010-07-05 12:22:51

标签: debugging compiler-construction scala implicit

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

  

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

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

作为一个例子,我想知道如何在implicit bf: CanBuildFrom[Repr, B, That] TraversableLike.map的{​​{1}}参数的基础上自行解决,而不在Stack Overflow上阅读this one之类的问题!

2 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:7)

  

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

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

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