2013-05-29 27 views
5

Từ các tài liệu ScalaTest là gì:Scala này 'mới' cú pháp

class ExampleSpec extends FlatSpec { 

def fixture = 
new { 
    val builder = new StringBuilder("ScalaTest is ") 
    val buffer = new ListBuffer[String] 
} 

...

Tôi không hiểu tại sao từ khóa mới đang được sử dụng ở đây. lịch thi đấu rõ ràng là một chức năng, mà tuyên bố và trả về ... những gì? Nó có vẻ là một đối tượng, vì nó có các thành viên (bộ đệm xây dựng &) có thể được truy cập bằng. ký hiệu.

Những gì đang được tạo ở đây một lớp ẩn danh là lớp con của AnyRef?

+1

Nếu bạn muốn đọc thêm về điều này, hãy tìm "sàng lọc cấu trúc" hoặc "kiểu con cấu trúc" – stew

+0

Tôi muốn nói "CÀI ĐẶT của một lớp ẩn danh" thay vì "lớp ẩn danh" - Sự trao đổi của 'đối tượng' và 'lớp' là một trong những thú cưng thời gian dài của tôi. :) –

Trả lời

13

Đúng, nó trả về trường hợp của lớp bất kỳ. Không khó để tự mình kiểm tra nó trong phiên REPL:

scala> def fixture = new { val string = "mr. String" } 
fixture: Object{val string: String} 

Java có thể làm điều tương tự, tin hay không. Sau đây là hợp lệ Java

(new Object() { 
    public void sayHello() { 
    System.out.println("hello!"); 
    } 
}).sayHello(); 

Phiên bản Java chỉ là một cú pháp dài hơn và có giới hạn hệ thống loại làm cho nó hầu như vô dụng. Thông tin thêm tại đây http://james-iry.blogspot.com/2009/04/java-has-type-inference-and-refinement.html

+0

@ JamesIry, nhưng thật đáng buồn trong java, khó sử dụng các cá thể ẩn danh như vậy không ở chỗ sáng tạo (giả sử chúng ta không sử dụng bất kỳ giao diện và lớp nào). –

+1

Điều đáng nói đến là tất cả các phương thức được gọi trên một đối tượng được định nghĩa như vậy được gọi bằng sự phản chiếu. –

+0

Điểm tốt Jean - nhưng nó phải được giải thích tại sao điều quan trọng đó là sự phản ánh đắt tiền. – selig

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