2011-01-28 34 views
6

Tôi không hiểu tại sao đoạn code sau đây không biên dịch:Bỏ dấu chấm khi chaining cuộc gọi

class Abc 
{ 
    def b (x : String) = x + "abc" 

    def a (y : String) = 
    { 
     val ls : List[String] = y.lines toList 
     b (ls.head) 
    } 
} 

Main.scala: 8: lỗi: loại không phù hợp; tìm thấy: java.lang.String yêu cầu: Int b (ls.head)

Khi tôi thay đổi "y.lines ToList" để

y.lines.toList 

hoặc thậm chí đến

y.lines toList; 

nó biên dịch.

Có lẽ trình biên dịch hiểu nó như

(y.lines).toList(b (ls.head)) 

hoặc một cái gì đó như thế, nhưng tôi vẫn không hiểu các quy tắc.

+0

Bạn có thể chèn câu lệnh của mình '(y.lines) .toList (b (ls.head)) ' (tốt, có thể bạn đã làm điều đó?) Trong REPL, để xác minh rằng errormessage là như nhau. Vâng - tôi đã làm nó, và trên thực tế, nó là. :) –

+0

Đó là lý do tại sao tôi không khiến mọi người rên rỉ về ';'. – Raphael

Trả lời

1

Không rõ ràng và đó là sự kết hợp cú pháp phím tắt của Scala và lập chỉ mục danh sách. Nếu bạn muốn có một gợi ý, hãy thử xác định lại b tới:

def b(x : String) = 0 

Bạn sẽ nhận được một số khác lại biên dịch rác, nhưng lỗi sẽ thay đổi. Tóm lại, trình biên dịch Scala sẽ cho phép bạn bỏ qua các dấu chấm và dấu chấm cho các phương thức 0 hoặc một tham số, và chúng ta biết b trông giống như bằng cách nào đó bị xích lại. trả về một trình lặp, có thể lấy một tham số làm chỉ mục danh sách. Tôi không chắc chắn về phần này một cách chính xác, nhưng có vẻ như một khi bạn bắt đầu bỏ qua các dấu chấm, lexer sẽ trở nên tham lam, và khi nó đi qua một phương thức có thể lấy một tham số, sẽ cố gắng chuyển câu lệnh tiếp theo tới nó. Trong trường hợp này, đó là một chuỗi, do đó, nó ném một lỗi cú pháp.

1

Bạn đã nhận nó tại chỗ trên với điều này:

(y.lines).toList(b (ls.head)) 

Với sự chỉ chỉnh con người có thể:

(y.lines).toList(b).apply(ls.head) 

Tôi không chắc rằng Scala sẽ quyết định trong trường hợp đặc biệt này.

Quy tắc, nói chung, là object (method parameters)* [method]. Trình biên dịch sẽ tiếp tục miễn là nó tìm thấy các mã thông báo cho một biểu thức hợp lệ. A ; hoàn thành biểu thức và như vậy sẽ là ) hoặc }. Nếu dòng tiếp theo trống, biểu thức cũng kết thúc. Nếu dòng tiếp theo bắt đầu bằng từ khóa được đặt trước (val, def, if, v.v.), cụm từ cũng sẽ kết thúc.

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