在尝试计算库的工作方式时,隐式转换会让人感到困惑。例如,查看像'val foo:Foo = 1'这样的表达式,将1转换为Foo的是什么?

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

有帮助吗?

解决方案

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

其他提示

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

  1. 明确的import声明。当import x.y._是一个对象时,请注意y,因为这是引入隐式范围的唯一方法。
  2. 正在转换为其他内容的类的对象伴随。
  3. 目标类的对象伴侣,只要该目标以某种方式显式化(例如在您的示例中)。
  4. 请注意,默认情况下,对象scala.Predef全部导入范围,这就是Scala默认隐含的范围。

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));
      ()
    }
  }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top