什么是<stable>以及<accessor>何时做 ScalaC语言 Xprint:typer?



我写了一点Scala

object SquareNumbers extends App {
  val numbers = List(1,2,3,4,5)
  val squares = numbers map (i => i * i)
  println (squares)
}

并按如下方式通过scalac运行:

$ scalac -Xprint:typer SquareNumbers.scala
[[syntax trees at end of                     typer]] // SquareNumbers.scala
package <empty> {
  object SquareNumbers extends Object with App {
    def <init>(): SquareNumbers.type = {
      SquareNumbers.super.<init>();
      ()
    };
    private[this] val numbers: List[Int] = immutable.this.List.apply[Int](1, 2, 3, 4, 5);
    <stable> <accessor> def numbers: List[Int] = SquareNumbers.this.numbers;
    private[this] val squares: List[Int] = SquareNumbers.this.numbers.map[Int, List[Int]](((i: Int) => i.*(i)))(immutable.this.List.canBuildFrom[Int]);
    <stable> <accessor> def squares: List[Int] = SquareNumbers.this.squares;
    scala.this.Predef.println(SquareNumbers.this.squares)
  }
}

我的问题是,输出中的<stable><accessor>是什么?它们叫什么(比如,它们有集体名词吗),它们做什么?

我想,这意味着它们是vals而不是vars,意味着它是从对象外部调用的。。。

这些是内部的(即,不通过新的2.10反射API暴露)标志。官方编译器ScalaDoc站点似乎已经关闭,但您可以查看Scala源代码以了解详细信息:

final val STABLE   = 1 << 22 // functions that are assumed to be stable
                             // (typically, access methods for valdefs)
                             // or classes that do not contain abstract types.

和:

final val ACCESSOR = 1 << 27 // a value or variable accessor (getter or setter)

在该文件的后面,您可以找到标识符(例如STABLE)和打印字符串(<stable>)之间的映射,在哪个阶段显示哪些标志的列表,等等。

ACCESSOR的含义非常明显,但STABLE则不然。

AFAICT,STABLE表示不可变字段(即val)或方法参数的getter,其在方法的范围内同样是不可变的。我想这是用来通过消除重新评估来进行优化的。

相关内容

  • 没有找到相关文章

最新更新