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>ますか? それらは何と呼ばれ(集合名詞を持っているかなど)、何をするのでしょうか?

推測では、それは vars ではなく vals であり、オブジェクトの外部から呼び出し可能であることを意味すると思います...

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) のゲッター、またはメソッドのスコープ内で同様に不変であるメソッド パラメーターを示します。これは、再評価を排除して最適化するために使用されると思います。

于 2013-11-13T15:16:29.173 に答える