2013-08-02 20 views
6

Tôi đã viết một chút nhỏ bé của Scala<stable> và <accessor> khi thực hiện Scalac -Xprint: typer là gì?

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

Và chạy nó thông qua scalac như vậy:

$ 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) 
    } 
} 

Câu hỏi của tôi là, là gì <stable><accessor> trong đầu ra? Họ được gọi là gì (như trong đó, họ có danh từ tập thể), và họ làm gì?

Tại một đoán, tôi muốn nói rằng có nghĩa là họ đã Vals thay vì vars, và có nghĩa là nó là một callable từ bên ngoài của đối tượng ...

Trả lời

4

Đây là những nội (tức là, không tiếp xúc qua API phản chiếu 2.10 mới) cờ. Trình biên dịch chính thức ScalaDoc site có vẻ là xuống, nhưng bạn sẽ nhìn thấy nguồn Scala cho 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) 

Sau đó trong tập tin mà bạn có thể tìm thấy các ánh xạ giữa định danh (ví dụ STABLE) và các chuỗi đã in (<stable>), danh sách các cờ được hiển thị ở các giai đoạn nào, v.v.

0

Ý nghĩa của ACCESSOR là khá rõ ràng, nhưng của STABLE thì không.

AFAICT, Ổn định biểu thị trình thu thập của trường không thể thay đổi (ví dụ: val) hoặc tham số phương pháp, không thay đổi tương tự trong phạm vi của phương pháp. Tôi đoán rằng điều này được sử dụng để tối ưu hóa bằng cách loại bỏ tái đánh giá.

Các vấn đề liên quan