Сопоставление с образцом является второй наиболее широко используемой функцией Scala после значений функций и замыканий. Scala обеспечивает отличную поддержку сопоставления с образцом при обработке сообщений.
Сопоставление с шаблоном включает последовательность альтернатив, каждая из которых начинается с ключевого слова case . Каждая альтернатива включает в себя шаблон и одно или несколько выражений , которые будут оцениваться, если шаблон соответствует. Символ стрелки => отделяет шаблон от выражений.
Попробуйте следующий пример программы, которая показывает, как сопоставить целочисленное значение.
пример
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" } }
Сохраните вышеуказанную программу в Demo.scala . Следующие команды используются для компиляции и выполнения этой программы.
команда
\>scalac Demo.scala \>scala Demo
Выход
many
Блок с инструкциями case определяет функцию, которая отображает целые числа в строки. Ключевое слово match обеспечивает удобный способ применения функции (например, функции сопоставления с шаблоном выше) к объекту.
Попробуйте следующий пример программы, которая сопоставляет значение с шаблонами разных типов.
пример
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" } }
Сохраните вышеуказанную программу в Demo.scala . Следующие команды используются для компиляции и выполнения этой программы.
команда
\>scalac Demo.scala \>scala Demo
Выход
2 many one
Сопоставление с использованием Case Class
Классы case — это специальные классы, которые используются при сопоставлении с образцами выражений. Синтаксически это стандартные классы со специальным модификатором: case .
Попробуйте следующее: это простой пример сопоставления с шаблоном, использующий класс case.
пример
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) }
Сохраните вышеуказанную программу в Demo.scala . Следующие команды используются для компиляции и выполнения этой программы.
команда
\>scalac Demo.scala \>scala Demo
Выход
Hi Alice! Hi Bob! Age: 32 year, name: Charlie?
Добавление ключевого слова case приводит к тому, что компилятор автоматически добавляет ряд полезных функций. Ключевое слово предполагает связь с выражениями регистра при сопоставлении с образцом.
Во-первых, компилятор автоматически преобразует аргументы конструктора в неизменяемые поля (vals). Ключевое слово val необязательно. Если вам нужны изменяемые поля, используйте ключевое слово var. Итак, наши списки аргументов конструктора теперь короче.
Во-вторых, компилятор автоматически реализует методы equals, hashCode и toString для класса, которые используют поля, указанные в качестве аргументов конструктора. Таким образом, нам больше не нужны наши собственные методы toString ().
Наконец, также тело класса Person становится пустым, потому что нет методов, которые нам нужно определить!