2010-09-01 36 views
5

Khi tôi cố gắng bỏ qua dấu chấm từ lời gọi phương pháp, như trong chương trình ví dụ này:"Phương pháp đệ quy <method name> cần loại" trong Scala nghĩa là gì?

object Test extends Application { 
    val baz = new Baz 
    var foo = baz bar 
    println(foo) 
} 

class Baz { 
    def bar = "bar" 
} 

tôi nhận được lỗi lạ. Người đầu tiên là error: recursive method foo needs type: println foo và người kia là error: type mismatch; found: Unit, required: Int, println(foo). Lỗi đầu tiên là một số cách kỳ lạ cố định nếu tôi chỉ định rằng loại foo nên là String. Cái thứ hai sẽ không biến mất trước khi tôi đặt dấu chấm giữa bazbar. Nguyên nhân của việc này là gì? Tại sao Scala nghĩ rằng baz bar là một phương pháp đệ quy?

+0

Tương tự: http://stackoverflow.com/questions/2246212/why-does-scalas-semicolon-inference-fail-here – missingfaktor

Trả lời

7

Vấn đề bạn đang thấy là nếu bạn bỏ qua các dấu chấm thì mã không rõ ràng. Trình biên dịch sẽ đối xử với các biểu hiện như

var foo = baz.bar(println(foo)) 

do đó foo được định nghĩa đệ quy và StringOps.apply phương pháp cần một Int luận (String sẽ được ngầm chuyển đổi sang StringOps như String không có phương pháp apply).

Bạn chỉ nên sử dụng toán tử giống cú pháp khi gọi các phương thức lấy một đối số không phải là Unit để tránh sự mơ hồ như vậy.

+0

Cảm ơn bạn rất nhiều vì câu trả lời. Tôi không có ý tưởng Scala sẽ cố gắng để đặt dòng với nhau như thế. Tôi nghĩ rằng nó xử lý ngắt dòng như một dấu chấm phẩy. Tôi đã thử nghiệm một chút, và vấn đề cũng có thể được giải quyết bằng cách chèn một dấu chấm phẩy sau 'val foo = baz bar'. – mranders

+0

Scala thường xử lý ngắt dòng là khoảng trắng nhưng trình biên dịch cố gắng suy ra dấu chấm phẩy khi cần. Trong trường hợp của bạn, điều này không hoạt động tốt cùng với suy luận kiểu. – Moritz

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