我写了一点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,其在方法的范围内同样是不可变的。我想这是用来通过消除重新评估来进行优化的。