2010-10-25 28 views
117

Trong văn học Scala khác nhau tôi thấy một số chú thích tự loại sử dụng "này" và những người khác sử dụng "tự":Sự khác biệt giữa điều này và tự trong các chú thích tự gõ?

trait A { this: B => ... } 
trait A { self: B => ... } 

Có sự khác biệt thực sự giữa cách sử dụng "này" hoặc "tự"? Liệu nó có quan trọng ở tất cả những gì bạn sử dụng tên? Đây có phải là hợp lệ không?

trait A { foo: B => ... } 

Trả lời

156

Tất cả ba biểu mẫu đều hợp lệ và có hiệu lực là B được giả định là loại this trong lớp A.

Hai biến thể đầu tiên

trait A { self: B => ... } 
trait A { foo: B => ... } 

giới thiệu self (tương ứng, foo) như là một bí danh cho this trong đặc điểm A. Điều này rất hữu ích khi truy cập tham chiếu this từ một lớp bên trong. I E. sau đó bạn có thể sử dụng self thay vì A.this khi truy cập vào tài liệu tham khảo this về đặc điểm A từ một lớp được lồng trong nó. Ví dụ:

class MyFrame extends JFrame { frame =>  
    getContentPane().add(new JButton("Hide") { 
    addActionListener(new ActionListener { 
     def actionPerformed(e: ActionEvent) { 
     // this.setVisible(false) --> shadowed by JButton! 
     frame.setVisible(false) 
     } 
    }) 
    }) 
} 

Các biến thể thứ ba,

trait A { this: B => ... } 

không giới thiệu một bí danh cho this; nó chỉ thiết lập kiểu tự.

+0

Cách tôi xem xét loại tự là đặc điểm tự khai báo là lấy một loại nhất định và trả lại khối mã, ví dụ: foo: B => {...}. Bây giờ những curlies tất nhiên là bỏ qua. Thật thú vị khi thấy rằng bạn có thể sử dụng tên đối tượng thay vì "này" bên trong bất kỳ phạm vi nào trong mã mặc dù [một cái gì đó chúng tôi làm mọi lúc trong javascript] –

+4

@Martin Odersky Có thể thêm hạn chế cho hai hoặc nhiều đặc điểm, một cái gì đó như 'đặc điểm A {self: B, C => ...}'? –

+13

@DmitryBespalov: Có, bạn có thể sử dụng từ khóa 'with' trong chú thích tự đánh máy. Ví dụ, 'trait A {self: B với C => ...} ' – Dave

16

Có sự khác biệt trong đó this luôn đề cập đến đối tượng được xác định bởi mẫu trong cùng.

Biểu thức this có thể xuất hiện trong phần tuyên bố của mẫu hoặc loại kết hợp. Nó là viết tắt của đối tượng được xác định bởi các mẫu trong cùng hoặc loại hợp chất kèm theo tham chiếu. Nếu đây là loại hợp chất, loại this là loại hợp chất đó. Nếu đó là mẫu của định nghĩa lớp hoặc đối tượng có tên đơn giản C, loại này giống với loại C. this. (Scala Ref. §6.5)

Vì vậy, nếu bạn gọi bạn tự loại foo, bạn có thể vẫn coi nó như this (trừ khi, tất nhiên, bạn đang ở trong một mẫu nội trong trường hợp này this sẽ giới thiệu đối tượng được xác định bởi nó - và trừ khi bạn không cung cấp cho bản thân mẫu bên trong cùng một tên) nhưng rõ ràng không phải là cách khác.

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