2012-06-30 24 views
12

Một tự loại trông giống như ví dụ sau:Lý do đằng sau `=>` trong một kiểu tự là gì?

trait A { self: String => } 

này nói rằng đặc điểm A (hoặc một subtype của nó) phải kế thừa lớp String.

Từ khóa self được theo sau bởi : tương tự với biến trong var s: String, trong đó loại đến sau :.

Nhưng trạng thái => là loại tự như thế nào? Lý do đằng sau này là gì ?

+1

Đó là một bit lạ của cú pháp tôi nghĩ vì nó có vẻ giống như một mũi tên mà sẽ trỏ đến một cái gì đó ... – david

+0

Vâng, khi bắt đầu học Scala, tôi luôn nghĩ mũi tên chỉ vào phần còn lại của cơ thể , trông giống như một chức năng và gây nhầm lẫn cho tôi rất nhiều. –

Trả lời

11

Chỉ cần đoán công việc ... Bạn cần một số dấu phân cách cụ thể của khai báo kiểu tự. Hãy tưởng tượng rằng => đã bị bỏ qua. this: String sẽ là một tuyên bố hợp lệ cú pháp (mặc dù trình kiểm tra loại sẽ khiếu nại).

Vì vậy, dấu phân cách nào phải là dấu phân tách? Bạn sẽ không muốn niềng răng lồng nhau như trait A { self: String { ... }}. Vì vậy, các dấu phân cách hiện tại không ghép nối tồn tại? => là người duy nhất tôi có thể nghĩ đến.

Trường hợp là => được sử dụng ở nơi khác? Là đường cho các loại chức năng (A => B) và đối với các cơ quan chức năng (i: Int => i + 1). Ngoài ra đối với các đối số theo từng tên và đối với các trường hợp đối sánh mẫu. Cách sử dụng cuối cùng này phần nào gắn kết với kiểu tự. Nó giống như kết hợp this là của một loại cụ thể, và sau đó xác định cơ thể tùy thuộc vào 'trận đấu' này. Tôi không biết, có lẽ đây là một sự tương tự ngớ ngẩn.

+0

Cảm ơn bạn đã chia sẻ suy nghĩ của mình về chủ đề đó. Nghe hay đấy. Tôi đã suy nghĩ theo một hướng tương tự. –

9

Lưu ý rằng self không phải là từ khóa, mà là từ định danh thông thường. Bạn thực sự có thể viết bất kỳ số nhận dạng hợp lệ nào khác thay cho số self. Và : sau khi một biểu thức là một loại kiểu ascription, một cái gì đó hoàn toàn hợp lệ bất cứ nơi nào một biểu thức là hợp lệ.

=> là điều cho Scala biết là tự loại. Nếu không, self: Type trông giống như một câu lệnh đơn giản, một biểu thức. Ví dụ:

class A 
class B extends A { 
    this: A 
} 

Đó là mã Scala hợp lệ và không có loại tự.

+0

Điểm tốt, cảm ơn bạn. Có một lý do cụ thể nào để sử dụng '=>' làm biểu tượng cho một kiểu tự hay là nó được chọn, bởi vì nó phù hợp với phần còn lại của cú pháp Scalas? –

+0

@JohnThreepwood Odersky phản đối các ký hiệu và từ khóa dành riêng, vì vậy anh ấy cố gắng sử dụng lại những từ khóa mà anh ấy có. Tôi nghĩ anh ta đã đi quá xa với điều đó khi nói đến dấu gạch dưới, nhưng đó là cách thức của nó. –

0

this nằm trong phạm vi bên trong phần thân của lớp, do đó, theo nghĩa đó, nó là một tham số (mặc dù chúng tôi chưa bao giờ nghĩ về nó theo cách đó). Cú pháp tự gõ đơn giản làm cho nó rõ ràng, và cho phép một cái để cho nó một tên khác (và gõ). Vì vậy, mũi tên trở thành một sự lựa chọn rất tốt như một dấu phân tách giữa chất kết dính và phạm vi của nó.

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