Sự khác biệt giữa cái này và cái tôi trong chú thích tự gõ?


134

Trong các tài liệu Scala khác nhau, tôi thấy một số chú thích tự gõ bằng cách sử dụng "này" và các chú thích khác sử dụng "tự":

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

Có sự khác biệt thực sự nào giữa việc sử dụng "cái này" hay "cái tôi" không? Có vấn đề gì với tên bạn sử dụng? Đây có phải là hợp lệ?

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

Câu trả lời:


181

Tất cả ba hình thức là hợp lệ và có hiệu lực Bđược coi là loại thistrong 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ư một bí danh cho thisđặc điểm A. Điều này rất hữu ích để truy cập thistài liệu tham khảo từ một lớp bên trong. Tức là sau đó bạn có thể sử dụng selfthay vì A.thiskhi truy cập thistham chiếu của đặc điểm Atừ một lớp được lồng trong nó. Thí 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 )
      }
    })
  })
}

Biến thể thứ ba,

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

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


Cách tôi nhìn vào kiểu tự là đặc điểm tự khai báo là lấy một loại nhất định và trả về khối mã, ví dụ foo: B => {...}. Bây giờ những curlies tất nhiên được 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ì "this" bên trong bất kỳ phạm vi nào trong mã mặc dù [một thứ chúng tôi làm mọi lúc trong javascript]
Ustaman Sangat

4
@Martin Oderky Có thể thêm hạn chế cho hai hoặc nhiều đặc điểm, đại loại như thế trait A { self: B, C => ... }nào?
Dmitry Bespalov

13
@DmitryBespalov: Có, bạn có thể sử dụng withtừ khóa trong chú thích tự gõ. Ví dụtrait A { self: B with C => ... }
Dave

btw bạn cũng có thể làm _: B =>cho trường hợp không bí danh cho đơn giản
Creos

17

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

Biểu thức thiscó thể xuất hiện trong phần câu lệnh của mẫu hoặc kiểu ghép. Nó là viết tắt của đối tượng được xác định bởi 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 thislà loại hợp chất đó. Nếu nó là một mẫu của một định nghĩa lớp hoặc đối tượng với đơn giản tên C , loại này giống như loại C . this. (Tham khảo Scala §6.5)

Vì vậy, nếu bạn gọi kiểu tự của mình foo, bạn vẫn có thể gọi nó là this(tất nhiên, trừ khi bạn ở trong một mẫu bên trong, trong trường hợp đó thissẽ đề cập đến đối tượng được xác định bởi nó - và trừ khi bạn không đưa ra bên trong mẫu tự gõ cùng tên) nhưng rõ ràng không phải là cách khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.