7

我写了一点 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,并且意味着它是来自对象外部的可调用对象......

4

2 回答 2

5

这些是内部的(即,不通过新的 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>)之间的映射、在哪些阶段显示哪些标志的列表等。

于 2013-08-02T20:10:38.003 回答
0

ACCESSOR的含义很明显,而STABLE的含义则不然。

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

于 2013-11-13T15:16:29.173 回答