2011-12-24 6 views
6

Quan sát mã sauTại sao tôi không thể bỏ qua "áp dụng" trong this.apply (_) trong Scala?

trait Example { 
    type O 
    def apply(o: O) 
    def f(o: O) = this.apply(o) 
} 

biên dịch tốt trong Scala. Tôi hy vọng rằng tôi có thể để lại apply như thường lệ, viết def f(o: O) = this(o). Tuy nhiên, điều này dẫn đến thông báo lỗi thú vị

type mismatch; found : o.type (with underlying type Example.this.O) 
       required: _31.O where val _31: Example 
possible cause: missing arguments for method or constructor 

Bất cứ ai có thể giải thích cho tôi điều gì đang xảy ra không?

Trả lời

4

Câu trả lời được chấp nhận không chính xác. Bạn có thể suy ra những gì các vấn đề thực tế là từ thực tế rằng đây biên dịch tốt:

trait Example { 
    def apply(o: String): String = o 
    def f(o: String) = this(o) 
} 

này (...) chỉ đại diện cho một cuộc gọi đến một nhà xây dựng khi các trang web gọi là một nhà xây dựng phụ trợ. Phần còn lại của thời gian đó là một cuộc gọi để áp dụng, giống như bạn tưởng tượng.

+0

xin lỗi, tôi không suy ra được vấn đề thực tế là gì, nhưng tôi thấy quan điểm của bạn. Bạn có thể giải thích thêm? –

+0

Đó là một lỗi với các loại trừu tượng. Lưu ý rằng ví dụ không biên dịch hoạt động nếu bạn tạo loại O cụ thể (ví dụ: "loại O = Chuỗi") hoặc nếu bạn đặt tham số kiểu thay vào đó (ví dụ: "đặc điểm Ví dụ [O]".) – extempore

+0

bạn có biết rằng số phát hành cho lỗi này? –

11

Bạn không thể vì này() bên trong một nhà xây dựng là một cuộc gọi đến constructor của đối tượng này (này() bất cứ nơi nào khác tạo ra một sự thất bại biên soạn) và không thể được làm thành một apply() cuộc gọi vì nó sẽ ẩn các nhà xây dựng và làm cho nó không thể gọi một nhà xây dựng khác trong đối tượng của bạn. điều này (args) luôn là lời gọi hàm phương thức khởi tạo (cả trong Java và Scala), vì vậy khi bên trong đối tượng của riêng bạn, bạn luôn phải gọi áp dụng (args).

+0

Huh! Tất nhiên, cảm ơn. Tôi đã nhầm lẫn về điều này bởi vì trong ví dụ của tôi, tôi đã có một bí danh cho 'this' (ví dụ' trait Example {f => ...} '), và bằng cách nào đó nó ít rõ ràng hơn rằng' f (o) 'là một cuộc gọi đến một nhà xây dựng. –