В данной статье мы рассмотрим совпадение шаблонов. Совпадение шаблона включает в себя последовательность возможных вариантов, каждый из которых начинается с ключевого слова 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.
В следующей статье мы рассмотрим регулярные выражения в данном языке программирования.