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.
Thay vì 'case _: Foo' bạn có thể viết' case Foo() '. – sepp2k
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
** "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