2013-08-02 45 views
6

我寫斯卡拉什麼是<stable>和<accessor>當做Scalac -Xprint:typer?

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>?他們叫什麼(如在,他們有集體名詞),他們做什麼?

在猜測,我會說,意味着他們丘壑,而不是增值經銷商,並表示這是從對象外的調用...

回答

4

這些都是內部(即不通過暴露新的2.10反射API)標誌。官方的編譯器ScalaDoc site似乎是下降的,但你可以看到details斯卡拉來源:

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. 

And

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

在這個文件以後,你可以找到標識符之間的映射(例如STABLE)和打印的字符串(<stable>),在哪些相位上顯示哪些標誌的列表等。

0

的含義ACCESSOR很明顯,但是穩定不是。

AFAICT,STABLE表示一個不可變字段的吸氣劑(即,val),或方法參數,這是該方法的範圍內同樣是不可改變的。我猜想這是通過消除重新評估來優化的。