Эта серия статей предназначена для занятых программистов, которые хотят выучить Scala быстро, за 2 часа или меньше. Эти статьи представляют собой письменную версию мини-курса Rock the JVM Scala на Light Speed, которую вы можете найти бесплатно на YouTube или на веб-сайте Rock the JVM в виде видео.
Это третья статья серии, в которой речь пойдет о Scala как о функциональном языке программирования. Вы можете посмотреть его в виде видео здесь или во встроенном видео ниже.
Итак, мы рассмотрели:
- Как начать работу с Scala
- Самые основы: значения, выражения, типы
- Ориентация объекта: классы, экземпляры, синглтоны, методы и базовые дженерики
- Функциональное программирование
Вам также могут понравиться:
Scala со скоростью света, часть 1: основы ,
часть 2: ориентация на объекты и
часть 3: функциональное программирование
Введите шаблон соответствия
Сопоставление с образцом — одна из самых мощных функций Scala. Начнем с аналогии с другими языками программирования, где вы, вероятно, видели оператор switch. Сопоставление с образцом похоже на переключение стероидов:
Scala
xxxxxxxxxx
1
val anInteger = 55
2
val order = anInteger match {
3
case 1 => "first"
4
case 2 => "second"
5
case 3 => "third"
6
case _ => anInteger + "th"
7
}
Как и все в Scala, структура сопоставления с образцом является выражением, потому что она сводится к значению (одному из значений регистра в правой части =>
). В качестве примечания, компилятор может вывести тип выражения, проверив типы, возвращаемые во всех случаях (в данном случае String).
Несколько вещей о сопоставлении с образцом:
- Подчеркивание означает что-либо (подстановочный знак)
- Шаблоны проверяются по порядку; первое совпадение будет определять значение выражения.
- Если никакие шаблоны не соответствуют,
MatchError
будет брошено.
Больше, чем просто переключатель
Сопоставление с образцом может проверять не только значения, но и структуру данных, а также может связывать фрагменты этих данных с именами, которые можно использовать в возвращаемом выражении. Классический пример с классами case (которые мы упомянули во второй части , легко разлагаются при сопоставлении с образцом).
Scala
xxxxxxxxxx
1
// Case class decomposition
2
case class Person(name: String, age: Int)
3
val bob = Person("Bob", 43) // Person.apply("Bob", 43)
4
val personGreeting = bob match {
6
case Person(n, a) => s"Hi, my name is $n and I am $a years old."
7
case _ => "Something else"
8
}
В этом выражении PM, мы не испытывая bob
против окончательного значения, но мы его соответствия против структуры личности, и в случае , если это совпадение, мы связывание его поле с именами n
и a
поэтому мы можем использовать их в возвращаемое выражение (обратите внимание на s-интерполированную строку).
PM могут сопоставлять классы дел и структуры такого типа на глубоком уровне, поэтому, если класс дел содержит член, который является другим классом дел, вы можете сопоставить вложенные классы дел без проблем.
Разложение других структур
Некоторые из часто используемых примеров разложения PM включают деконструкцию кортежей и списков. Давайте посмотрим код:
Scala
xxxxxxxxxx
1
// deconstructing tuples
2
val aTuple = ("Bon Jovi", "Rock")
3
val bandDescription = aTuple match {
4
case (band, genre) => s"$band belongs to the genre $genre"
5
case _ => "I don't know what you're talking about"
6
}
Как и в случае с классами case, мы сопоставляем структуру кортежей, и в случае она совпадает; мы привязываем членов кортежа к соответствующим именам.
Поистине волшебной особенностью является разложение других структур, таких как списки:
Scala
xxxxxxxxxx
1
// decomposing lists
2
val aList = List(1,2,3)
3
val listDescription = aList match {
4
case List(first, 2, _) => s"List with 2 on its second position, starting with $first"
5
case _ => "unknown list"
6
}
Случай PM говорит: попробуйте сопоставить aList
со структурой списка, содержащего ровно 3 элемента; первое может быть чем угодно и будет названо first
, второе должно быть ровно 2, а третье неважно.
Существует множество других шаблонов и возможностей для функции PM в Scala, но мы пока будем сокращать ее, чтобы не допускать ненужного усложнения.
В следующей статье этой серии мы рассмотрим некоторые расширенные функции Scala, которые вы, вероятно, увидите в реальном коде. Будьте на связи!