Учебники

Scala — Pattern Matching

Сопоставление с образцом является второй наиболее широко используемой функцией 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 становится пустым, потому что нет методов, которые нам нужно определить!