Như @cchantep nêu trong bình luận của ông, self : T
trong trường hợp này là một loại tự chú thích về cơ bản nói rằng một thể hiện của Foo[T]
nhu cầu cũng cư xử như một T
. Bạn có thể thấy đó thực sự là trường hợp trong FooImpl
, dưới dạng FooImpl <: Foo
.
Bạn có thể tìm hiểu thêm về chú thích tự nhập here, here hoặc here. Chú ý, hầu hết thời gian, bạn sẽ thấy nó được sử dụng trong ngữ cảnh Dependency Injection và Cake Pattern.
thú vị nhất từ the second link là tôi nghĩ rằng phần đầu tiên:
Nói cách khác, là những gì các điểm để làm điều này:
trait A
trait B { this: A => }
khi bạn có thể thay vì chỉ làm điều này:
trait A
trait B extends A
Tại sao bạn nên sử dụng [cú pháp này]?
[...] câu trả lời thường đi xuống "B yêu cầu A" (chú thích) so với "B là A" (thừa kế) và rằng trước đây là tốt hơn cho quản lý phụ thuộc.
Cuối cùng, và chỉ để làm rõ, lưu ý rằng từ self
là không cần thiết chút nào. Đây có thể là bất kỳ tên biến hợp lệ nào, nhưng self
hoặc this
hầu như là một quy ước. Tức là, bạn có thể làm:
trait A
trait B { myVar: A => }
nhưng điều đó sẽ ít phổ biến hơn.
Đó là loại tự thực thi rằng bất kỳ loại phụ nào của 'Foo' phải là tham số kiểu được đặt cho' Foo' – cchantep