2011-11-09 20 views
29

Tôi hiểu việc sử dụng cho explicitly typed self-references:Explicit tự tài liệu tham khảo không có loại/khác biệt với '' này ''

trait T { 
    self : T2 => 
    ... 
} 

Trong cơ thể, self là một bí danh cho this nhưng có loại chính xác hơn T with T2.

Bây giờ, tôi đã nhìn thấy điều này trong mã:

trait T { 
    self => 
    ... 
} 

Đó là, một tự tham khảo rõ ràng không có thông tin loại bổ sung. Trong cấu hình này, có tình huống nào trong đó self không chỉ là bí danh cho this?

Trả lời

35

Nó là một bí danh cho this.

Ví dụ đầu tiên của bạn là hữu ích để đảm bảo rằng đặc điểm đã được trộn vào một loại thích hợp và làm cho các phương thức đó khả dụng.

Ví dụ thứ hai hữu ích khi bạn có các lớp bên trong với xung đột đặt tên, để hiển thị phạm vi bên ngoài. Ví dụ:

trait U { 
    self => 
    val name = "outer" 
    val b = new AnyRef { 
    val name = "inner" 
    println(name) 
    println(this.name) 
    println(self.name) 
    } 
} 

Sau đó new AnyRef with U in

inner 
inner 
outer 

"tự" không phải là một từ khóa đặc biệt - bạn có thể sử dụng "chuối =>" hay bất cứ điều gì bạn thích, nhưng nó thường được sử dụng theo quy ước.

Cây này lên khá một chút trong Swing, nơi bạn thực hiện rất nhiều trên các lớp bên trong (hộp văn bản trong scrollpanes, vv), thường có nhiều phương thức có cùng tên với các lớp bên ngoài.

+2

Điểm tốt, cảm ơn. Vì vậy, nó tương đương với dạng 'U.this.name' dài hơn trong trường hợp này, tôi đoán vậy. – Philippe

7

Trong trường hợp đó self là một cách khác để nói this.

Nếu bạn tình cờ có lớp bên trong, tuy nhiên, this bên trong lớp bên trong sẽ là lớp bên trong và self sẽ là lớp chứa.

Đó là sự khác biệt duy AFAIK

+0

Và có lẽ mục đích của nó. – kboom

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