2011-12-21 31 views
15

Trong Scala 2.9.1 tôi nhận được các hành vi sau đây:Scala: thứ tự định nghĩa cho đối tượng đồng hành vs trường hợp lớp

class Foo { 
    case class X() 
    object X   // this compiles 

    def bar() { 
     object Y   // this compiles 
     case class Y() 

     case class Z() 
     object Z   // won't compile (see below) 
    } 
} 

Trình biên dịch phàn nàn cho Object Z: lỗi: Z đã được định nghĩa là (trình biên dịch tạo) đối tượng đồng hành lớp case Z

Có vẻ như không được phép xác định đối tượng đồng hành cho một lớp chữ hoa sau định nghĩa lớp vỏ nếu chúng nằm trong định nghĩa hàm. Đây có phải là lỗi trình biên dịch hay cố ý không? Nếu sau này, tại sao?

Trả lời

12

Đây là lỗi đã biết: SI-3772: companions and method-owned case classes. Điều này là một phần cố định, nhưng vấn đề của OP vẫn còn. Bình chọn nó nếu bạn muốn nó cố định.

+0

Thật dễ dàng để làm việc xung quanh, vì vậy tôi không chắc chắn rằng nó có giá trị bỏ phiếu lên. Cảm ơn bạn đã liên kết đến vé. –

1

Lý do tại sao phép đầu tiên được phép và thứ hai không phải là các lớp và đối tượng có thể có định nghĩa chuyển tiếp, nhưng định nghĩa không thể. Vậy tại sao trình biên dịch có thể trộn object X với trình biên dịch được xác định bởi lớp chữ thường, không thể thực hiện điều đó trong trường hợp thứ hai.

Tôi tự hỏi điều gì xảy ra trong trường hợp Y: shadowing hoặc đối tượng đồng hành không được tạo ra ở tất cả?

+0

Chờ đã, cái gì? :-) Bạn có nghĩa là "các lớp và đối tượng có thể có định nghĩa chuyển tiếp, nhưng ** phương thức ** không thể"? –

+1

@GregorScheidt Cả phương pháp lẫn chức năng. Vâng, Scala Spec không biết "phương pháp" là gì, vì vậy tôi cũng có thể gọi chúng là các hàm, nhưng tôi ghét cái tên nhầm lẫn xung quanh "hàm". –

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