2010-02-12 36 views

Trả lời

31

Thật sự rất dễ dàng để vô tình sử dụng một lớp chữ thường không phải là một mẫu.

scala> case class Foo            
warning: there were deprecation warnings; re-run with -deprecation for details 
defined class Foo 

scala> (new Foo: Any) match { case Foo => true; case _ => false } 
res10: Boolean = false 

Thay vì:

scala> (new Foo: Any) match { case _: Foo => true; case _ => false } 
res11: Boolean = true 

Hoặc tốt hơn:

scala> case object Bar            
defined module Bar 

scala> (Bar: Any) match { case Bar => true; case _ => false }   
res12: Boolean = true 

CẬP NHẬT Hy vọng rằng bảng điểm dưới đây sẽ chứng minh tại sao một danh sách tham số có sản phẩm nào được ưa chuộng vào danh sách tham số thiếu phản đối.

scala> case class Foo() // Using an empty parameter list rather than zero parameter lists. 
defined class Foo 

scala> Foo // Access the companion object Foo 
res0: Foo.type = <function0> 

scala> Foo() // Call Foo.apply() to construct an instance of class Foo 
res1: Foo = Foo() 

scala> case class Bar 
warning: there were deprecation warnings; re-run with -deprecation for details 
defined class Bar 

scala> Bar // You may expect this to construct a new instance of class Bar, but instead 
      // it references the companion object Bar 
res2: Bar.type = <function0> 

scala> Bar() // This calls Bar.apply(), but is not symmetrical with the class definition. 
res3: Bar = Bar() 

scala> Bar.apply // Another way to call Bar.apply 
res4: Bar = Bar() 

Đối tượng trường hợp sẽ vẫn được ưu tiên hơn danh sách tham số trống.

+3

Thay vì 'case _: Foo' bạn có thể viết' case Foo() '. – sepp2k

+0

Tôi vẫn chưa hiểu. Tại sao tôi mong đợi 'Bar' xây dựng để tạo ra một thể hiện mới của lớp' Bar'? – missingfaktor

+0

** "Bar() // Lệnh này gọi Bar.apply(), nhưng không đối xứng với định nghĩa lớp." ** - Đối số này cũng áp dụng cho các lớp bình thường (không phải trường hợp). Vậy tại sao trình biên dịch không hiển thị cảnh báo khi tôi định nghĩa một lớp như vậy mà không có danh sách tham số? (ví dụ, 'lớp Bar') – missingfaktor

15

Không có tham số, mọi trường hợp của lớp chữ thường không thể phân biệt được và do đó về bản chất là một hằng số. Sử dụng một đối tượng cho trường hợp đó.

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