English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Scala предоставляет мощный механизм шаблонного сопоставления, который широко используется.
Одна шаблонная замена содержит несколько вариантов, каждый из которых начинается с ключевого слова case. Каждая опция содержит шаблон и одну или несколько выражений. Символ стрелки => Разделены шаблоном и выражением.
Вот пример простого шаблонного сопоставления целочисленных значений:
object Test { def main(args: Array[String]) { println(matchTest(3)) } def matchTest(x: Int): String = x match { case 1 => "one" case 2 => "two" case _ => "many" } }
Выполните вышеуказанный код, результат вывода будет:
$ scalac Test.scala $ scala Test many
match соответствует switch в Java, но пишется после выбора выражения. То есть: Выборка match {варианты}。
Выражение match выполняет вычисление, пытаясь выполнить каждый шаблон в порядке кодирования, и останавливается, как только找到一个 соответствующий case, оставшиеся cases не проверяются.
Давайте рассмотрим шаблонное сопоставление с различными типами данных:
object Test { def main(args: Array[String]) { println(matchTest("two")) println(matchTest("test")) println(matchTest(1)) println(matchTest(6)) } def matchTest(x: Any): Any = x match { case 1 => "one" case "two" => 2 case y: Int => "scala.Int" case _ => "many" } }
Выполните вышеуказанный код, результат вывода будет:
$ scalac Test.scala $ scala Test 2 many one scala.Int
В примере первый case соответствует целочисленному значению 1, второй case соответствует строковому значению "two", третий case соответствует типу шаблона, используемому для проверки того, является ли传入ное значение целочисленным, что лучше, чем использование isInstanceOf для проверки типа. Четвертый case представляет собой опцию полного соответствия по умолчанию, то есть вариант, который используется, если не найдено других соответствий, подобно default в switch.
Классы, определяемые с помощью ключевого слова case, являются примерными классами (case classes), которые представляют собой особые классы, оптимизированные для использования в шаблонном сопоставлении.
Вот простая примерная классовая демонстрация:
object Test { 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("Привет, Алиса!") case Person("Bob", 32) => println("Привет, Боб!") case Person(name, age) => println("Возраст: " + age + " года, имя: " + name + "?") } } } // Примерный класс case class Person(name: String, age: Int) }
Выполните вышеуказанный код, результат вывода будет:
$ scalac Test.scala $ scala Test Привет, Алиса! Привет, Боб! Возраст: 32 года, имя: Чарли?
При объявлении примерного класса автоматически происходит следующее:
Каждый параметр конструктора становится val,除非 явно указан как var, но это не рекомендуется;
Метод apply предоставлен в сопутствующем объекте, поэтому объекты можно создавать без использования ключевого слова new;
Предоставьте метод unapply, чтобы моделирование шаблонов работало;
Создайте методы toString, equals, hashCode и copy,除非 явно предоставлены определения этих методов.