Руководство по Scala. Совпадение шаблонов.

В данной статье мы рассмотрим совпадение шаблонов. Совпадение шаблона включает в себя последовательность возможных вариантов, каждый из которых начинается с ключевого слова case. Каждый из вариантов включает в себя одно или несколько выражений и шаблон, в случае совпадения которого выражения будут выполнены.

Для понимания того, как это работает на практике, рассмотрим следующий пример:


package net.proselyte.scalatutorial.patterns

/**
  * Simple Scala class that demonstrates pattern match in Scala.
  *
  * @author Eugene Suleimanov
  **/

object PatternMatchDemo {
  def main(args: Array[String]) {
    println(specialtyTest("Java"));
    println(specialtyTest("C++"));
    println(specialtyTest("Scala"));
    println(specialtyTest("PHP"));
  }

  def specialtyTest(specialty: String) = specialty match {
    case "Scala" => "Scala Developer"
    case "Java" => "Java Developer"
    case "C++" => "C++ Developer"
    case _ => "Unsupported specialty"
  }
}

В результате выполнения данной программы мы получим следующий вывод в консоль:


Java Developer
C++ Developer
Scala Developer
Unsupported specialty

В данном примере мы проверяем совпадение специальности. Для трёх случаев у нас указаны варианты поведения, а для остальных (обозначается знаком “_”) у нас есть стандартный вывод “Unsupported specialty”.

В данном примере функционал крайне схож с оператором “switch”.
Рассмотрим другой вариант, в котором данная структура будет более уместна.


package net.proselyte.scalatutorial.patterns

/**
  * Simple Scala class that demonstrates pattern match using classes in Scala.
  *
  * @author Eugene Suleimanov
  **/
object PatternMatchUsingClassDemo {
  def main(args: Array[String]) {
    val scalaDeveloper = new Developer("Eugene", "Suleimanov", "Java/Scala Developer", 3);
    val cppDeveloper = new Developer("Ivan", "Ivanov", "C++ Developer", 5);
    val phpDeveloper = new Developer("Kolya", "Nikolaev", "PHP Developer", 2);

    for (developer  println("This is Eugene Suleimanov - Java/Scala Developer. His experience is 3 years.");
        case Developer("Ivan", "Ivanov", "C++ Developer", 5) => println("This is Ivan Ivanov - C++ Developer. His experience is 5 years.");
        case Developer(firstName, lastName, specialty, experience) => println("This is " + firstName + " " + lastName + " - " + specialty + ". His experience is " + experience + " years.");
      }
    }
  }

  case class Developer(firstName: String, lastName: String, specialty: String, experience: Int);
}

В результате выполнения данной программы мы получим следующий вывод в консоль:


This is Eugene Suleimanov - Java/Scala Developer. His experience is 3 years.
This is Ivan Ivanov - C++ Developer. His experience is 5 years.
This is Kolya Nikolaev - PHP Developer. His experience is 2 years.

В данном примере компилятор автоматически вставляет значения переменных, анализируя совпадение шаблона.
Вначале, значения автоматически преобразовываются в неизменяемые поля. Далее, с помощью автоматически переопределённых методов hashCode, equals и toString, значения подставляются в шаблон.

На этом мы заканчиваем изучение совпадения шаблонов в Scala.
В следующей статье мы рассмотрим регулярные выражения в данном языке программирования.