2009-08-05 5 views
9

tôi đang trải qua những cuốn sách tuyệt vời Programming in Scala khi tôi đi qua một đoạn mã mà chỉ không có ý nghĩa với tôi:Scala dot cú pháp (hoặc thiếu)

def above(that: Element): Element = { 
    val this1 = this widen that.width 
    val that1 = that widen this.width 
    elem(this1.contents ++ that1.contents) 
} 

Lưu ý dòng 2 và 3:

val this1 = this widen that.width 

Nó có vẻ như tôi sẽ có thể thay thế này với:

val this1 = this.widen that.width 
.210

Tuy nhiên, khi tôi cố gắng biên dịch thay đổi này, nó mang lại cho các lỗi sau:

error: ';' expected but '.' found.
val this1 = this.widen that.width ^

Tại sao cú pháp này không thể chấp nhận?

+1

Các bản sao có thể có: http://stackoverflow.com/questions/1181533/what-are-the-precise-rules-for-when-you-can-omit-parenthesis-dots-braces-fu và http: // stackoverflow.com/questions/1006967/scala-which-characters-can-i-omit –

Trả lời

17

Dòng 2 sử dụng phương pháp widen như một nhà điều hành, thay vì sử dụng nó như là một phương pháp trong cách Java:

val this1 = this.widen(that.width) 

Lỗi này xảy ra bởi vì bạn đã bỏ qua các dấu ngoặc đơn, mà bạn chỉ có thể làm khi bạn sử dụng một phương thức trong ký pháp toán tử. Bạn không thể làm điều này ví dụ:

"a".+ "b" // error: ';' expected but string literal found. 

Thay vào đó bạn nên viết

"a".+ ("b") 

Trên thực tế bạn có thể làm điều này với số nguyên, nhưng đó là vượt quá phạm vi của câu hỏi này.

Read more:

  • Chương 5 phần 3 của cuốn sách của bạn là về các ký hiệu điều hành, ít nhất là trong ấn bản đầu tiên, phiên bản 5
  • A Tour of Scala: Operators
3

Tôi đã không thử nó nhưng có lẽ công trình này: val this1 = this.widen(that.width)

widen có lẽ là một phương pháp dùng một tham số (cộng với this tham khảo), phương pháp này có thể được sử dụng như các nhà khai thác như trong mã mẫu đầu tiên của bạn.

2

Khi bạn sử dụng một dấu chấm bạn đang sử dụng kiểu dấu chấm cho lời gọi phương thức. Khi bạn không, bạn đang sử dụng kiểu nhà điều hành. Bạn không thể kết hợp cả hai cú pháp cho lời gọi phương thức rất giống nhau, mặc dù bạn có thể kết hợp hai cú pháp cho các lời gọi khác nhau - chẳng hạn như that.width được sử dụng như một tham số trong lời gọi kiểu mở rộng của toán tử.

Vui lòng tham khảo Which characters can I omit in Scala? hoặc What are the precise rules for when you can omit parenthesis, dots, braces, = (functions), etc.?.