Scala - Khớp mẫu
So khớp mẫu là tính năng được sử dụng rộng rãi thứ hai của Scala, sau các giá trị và đóng của hàm. Scala cung cấp hỗ trợ tuyệt vời cho việc đối sánh mẫu, trong việc xử lý các thông báo.
Đối sánh mẫu bao gồm một chuỗi các lựa chọn thay thế, mỗi lựa chọn bắt đầu bằng từ khóa case. Mỗi giải pháp thay thế bao gồm mộtpattern và một hoặc nhiều expressions, sẽ được đánh giá nếu mẫu phù hợp. Một biểu tượng mũi tên => tách mẫu khỏi các biểu thức.
Hãy thử chương trình ví dụ sau, chương trình này cho biết cách đối sánh với giá trị số nguyên.
Thí dụ
object Demo {
def main(args: Array[String]) {
println(matchTest(3))
}
def matchTest(x: Int): String = x match {
case 1 => "one"
case 2 => "two"
case _ => "many"
}
}
Lưu chương trình trên vào Demo.scala. Các lệnh sau được sử dụng để biên dịch và thực thi chương trình này.
Chỉ huy
\>scalac Demo.scala
\>scala Demo
Đầu ra
many
Khối với các câu lệnh trường hợp xác định một hàm, ánh xạ các số nguyên thành chuỗi. Từ khóa đối sánh cung cấp một cách thuận tiện để áp dụng một hàm (như hàm đối sánh mẫu ở trên) cho một đối tượng.
Hãy thử chương trình ví dụ sau, chương trình này khớp một giá trị với các mẫu của các loại khác nhau.
Thí dụ
object Demo {
def main(args: Array[String]) {
println(matchTest("two"))
println(matchTest("test"))
println(matchTest(1))
}
def matchTest(x: Any): Any = x match {
case 1 => "one"
case "two" => 2
case y: Int => "scala.Int"
case _ => "many"
}
}
Lưu chương trình trên vào Demo.scala. Các lệnh sau được sử dụng để biên dịch và thực thi chương trình này.
Chỉ huy
\>scalac Demo.scala
\>scala Demo
Đầu ra
2
many
one
Đối sánh bằng cách sử dụng các lớp tình huống
Các case classeslà các lớp đặc biệt được sử dụng để so khớp mẫu với các biểu thức chữ hoa chữ thường. Về mặt cú pháp, đây là các lớp tiêu chuẩn với một công cụ sửa đổi đặc biệt:case.
Hãy thử cách sau, nó là một ví dụ đối sánh mẫu đơn giản bằng cách sử dụng lớp chữ hoa chữ thường.
Thí dụ
object Demo {
def main(args: Array[String]) {
val alice = new Person("Alice", 25)
val bob = new Person("Bob", 32)
val charlie = new Person("Charlie", 32)
for (person <- List(alice, bob, charlie)) {
person match {
case Person("Alice", 25) => println("Hi Alice!")
case Person("Bob", 32) => println("Hi Bob!")
case Person(name, age) => println(
"Age: " + age + " year, name: " + name + "?")
}
}
}
case class Person(name: String, age: Int)
}
Lưu chương trình trên vào Demo.scala. Các lệnh sau được sử dụng để biên dịch và thực thi chương trình này.
Chỉ huy
\>scalac Demo.scala
\>scala Demo
Đầu ra
Hi Alice!
Hi Bob!
Age: 32 year, name: Charlie?
Việc thêm từ khóa trường hợp khiến trình biên dịch tự động thêm một số tính năng hữu ích. Từ khóa gợi ý sự liên kết với các biểu thức chữ hoa chữ thường trong đối sánh mẫu.
Đầu tiên, trình biên dịch tự động chuyển đổi các đối số của hàm tạo thành các trường bất biến (vals). Từ khóa val là tùy chọn. Nếu bạn muốn các trường có thể thay đổi, hãy sử dụng từ khóa var. Vì vậy, danh sách đối số phương thức khởi tạo của chúng ta bây giờ ngắn hơn.
Thứ hai, trình biên dịch tự động triển khai equals, hashCode, và toStringcác phương thức cho lớp, sử dụng các trường được chỉ định làm đối số của phương thức khởi tạo. Vì vậy, chúng ta không cần các phương thức toString () của riêng mình nữa.
Cuối cùng, phần thân của Person lớp trở nên trống vì không có phương thức nào mà chúng ta cần xác định!