4

当试图弄清楚一个库是如何工作的时,隐式转换是令人困惑的。例如,查看像 'val foo: Foo = 1' 这样的表达式,是什么将 1 转换为 Foo?

是否可以指示 scala 库(或 REPL)打印出在评估表达式时正在执行的代码路径?

4

3 回答 3

7

您可以将“-Xprint:typer”添加到编译器命令行(或“-Ybrowse:typer”用于摇摆 GUI 浏览器)以查看显式应用转换的代码。

于 2009-11-30T07:53:32.073 回答
3

作为打印转换的替代方法,必须意识到隐式不能突然出现。您必须以某种方式将它们纳入范围。替代方案是:

  1. 明确import的声明。注意import x.y._wheny是一个对象,因为这是将隐式引入范围的唯一方法。
  2. 正在转换为其他东西的类的对象伴侣。
  3. 目标类的对象伴侣,只要该目标以某种方式明确(例如在您的示例中)。

请注意,默认情况下,对象scala.Predef全部导入范围,这就是 Scala 的默认隐式进入范围的方式。

于 2009-11-30T14:55:53.820 回答
0

scalac -print在应用隐式类型转换后打印代码。

class A{
    val x : String = "hi" drop 1 
}

将导致:

package <empty> {
  class A extends java.lang.Object with ScalaObject {
    @remote def $tag(): Int = scala.ScalaObject$class.$tag(A.this);
    private[this] val x: java.lang.String = _;
    <stable> <accessor> def x(): java.lang.String = A.this.x;
    def this(): A = {
      A.super.this();
      A.this.x = scala.this.Predef.forceRandomAccessCharSeq(
        scala.this.Predef.stringWrapper("hi").drop(1));
      ()
    }
  }
}
于 2009-11-30T15:56:17.333 回答