2013-04-28 21 views
11

Tôi tìm thấy một số sử dụng khó hiểu của đặc điểm ở một số mã unittesting, chẳng hạn như:Các dấu ngoặc nhọn sau đây hoạt động như thế nào?

trait MyTrait { 
    val t1 = ... //some expression 
    val t2 = ... //some expression 
} 

Và sau đó nhanh chóng các đặc điểm sử dụng mới và khi đó một số biểu bọc bởi dấu ngoặc nhọn theo instantiation.

test("it is a test") { 
    new MyTrait { 
    // do something with t1 and t2 
    } 
} 

Tôi bị nhầm lẫn bởi cú pháp lạ này.

Câu hỏi của tôi là:

  1. tại sao sử dụng theo đặc điểm instantiation bởi dấu ngoặc nhọn?

  2. mục đích của việc khởi tạo đặc điểm trong trường hợp này là gì và các trường hợp khác cũng có thể hữu ích?

+0

Duplicate của http://stackoverflow.com/questions/12891321/why-are-traits-instantiable, http://stackoverflow.com/questions/6155570/what-does-it-mean-to-instantiate-a-trait – sourcedelica

Trả lời

22

Bạn không instantiating các đặc điểm: đặc điểm của mình không thể được instantiated; chỉ các lớp không trừu tượng mới có thể. Những gì bạn đang làm ở đây là sử dụng viết tắt của Scala cho cả hai định nghĩa một lớp vô danh/vô danh mở rộng đặc điểm và khởi tạo nó trong cùng một câu lệnh.

val anonClassMixingInTrait = new MyTrait { 
    def aFunctionInMyClass = "I'm a func in an anonymous class" 
} 

là tương đương với:

class MyClass extends MyTrait { 
    def aFunctionInMyClass = "I'm a func in a named class" 
} 

val namedClassMixingInTrait = new MyClass 

Sự khác biệt là bạn có thể chỉ instaniate rằng lớp vô danh tại thời điểm định nghĩa vì nó không có một cái tên và nó không thể có đối số nhà xây dựng .

+0

Chỉnh sửa - 'MyClass' không liên quan gì đến nó. – sourcedelica

6

Steve Buzzard đã giải thích, các lớp ẩn danh là gì, nhưng bạn cũng đã yêu cầu cho mục đích này. Mục đích ở đây là, trong các bài kiểm tra bạn thường có một số giá trị mặc định, bạn muốn sử dụng trong mọi bài kiểm tra. Đôi khi bạn cũng có trạng thái, điều đó có thể bị thay đổi bởi một số xét nghiệm. Để luôn bắt đầu với các giá trị chính xác (các thử nghiệm cũng có thể chạy song song), bạn có thể đóng gói chúng trong các trường hợp ẩn danh này. Mã bên trong cá thể ẩn danh này là hàm khởi tạo, sẽ được đánh giá lúc khởi tạo, do đó thực thi các kiểm thử của bạn.

2
val t = new MyTrait { 
    val t1 = ... //some expression 
    val t2 = ... //some expression 
} 

cũng giống như

val t = new AnyRef with MyTrait { 
    val t1 = ... //some expression 
    val t2 = ... //some expression 
} 

cũng giống như

val t = new Object with MyTrait { 
    val t1 = ... //some expression 
    val t2 = ... //some expression 
} 
Các vấn đề liên quan