Защитные условия и привязка
Условия при сопоставлении
«Защитные условия и привязка» — бесплатный урок Scala for Backend Engineering & Functional Programming на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Scala for Backend Engineering & Functional Programming, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.
Что такое условие?
Условие добавляет к варианту логическое условие с помощью if. Вариант сопоставляется только тогда, когда подходит шаблон и условие истинно.
Условия позволяют разделить один шаблон на более точные варианты в зависимости от значения.
Добавление условия if
Запишите условие после шаблона: case n if n > 0 =>. Если условие ложно, сопоставление продолжается со следующим вариантом.
object Main {
def sign(n: Int): String = n match {
case x if x > 0 => "positive"
case x if x < 0 => "negative"
case _ => "zero"
}
def main(args: Array[String]): Unit = {
println(sign(5))
println(sign(-3))
println(sign(0))
}
}Сначала привязка, затем условие
В условии можно обратиться к имени, привязанному в шаблоне. Так проверяются свойства сопоставленного значения.
object Main {
def fizz(n: Int): String = n match {
case x if x % 15 == 0 => "FizzBuzz"
case x if x % 3 == 0 => "Fizz"
case x if x % 5 == 0 => "Buzz"
case x => x.toString
}
def main(args: Array[String]): Unit = {
println(fizz(15))
println(fizz(9))
println(fizz(7))
}
}Условия для диапазонов
Условия отлично подходят для диапазонов, которые нельзя напрямую выразить шаблонами литералов.
object Main {
def band(score: Int): String = score match {
case s if s >= 90 => "A"
case s if s >= 80 => "B"
case s if s >= 70 => "C"
case _ => "F"
}
def main(args: Array[String]): Unit = {
println(band(95))
println(band(83))
println(band(60))
}
}Привязка шаблона с помощью @
Символ @ привязывает всё сопоставленное значение к имени, одновременно сопоставляя его структуру.
Здесь whole @ pattern означает: сопоставить pattern, а также назвать сопоставленное значение whole.
object Main {
def main(args: Array[String]): Unit = {
val x: Any = 7
val msg = x match {
case n @ (_: Int) => s"int value is $n"
case _ => "other"
}
println(msg)
}
}Привязка в коллекциях
Привязка с помощью @ особенно удобна со структурированными шаблонами: например, можно сохранить весь список и одновременно проверить его начало.
object Main {
def describe(xs: List[Int]): String = xs match {
case all @ (first :: _) => s"starts with $first, full = $all"
case Nil => "empty"
}
def main(args: Array[String]): Unit = {
println(describe(List(1, 2, 3)))
println(describe(Nil))
}
}Сочетание шаблона типа и условия
Шаблон типа можно сочетать с условием. Сначала проверяется тип, затем логическое условие.
object Main {
def label(x: Any): String = x match {
case s: String if s.length > 3 => "long string"
case s: String => "short string"
case _ => "not a string"
}
def main(args: Array[String]): Unit = {
println(label("hello"))
println(label("hi"))
println(label(42))
}
}Несколько условий
Условие — это обычное логическое выражение, поэтому условия можно объединять с помощью && и ||.
object Main {
def category(age: Int): String = age match {
case a if a >= 13 && a <= 19 => "teen"
case a if a < 13 => "child"
case _ => "adult"
}
def main(args: Array[String]): Unit = {
println(category(15))
println(category(8))
println(category(40))
}
}Условия не проваливаются дальше
Если шаблон подходит, но его условие ложно, Scala переходит к следующему варианту, а не к следующему условию того же шаблона.
Убедитесь, что более поздний вариант может обработать значения, не прошедшие ни одно условие.
object Main {
def test(n: Int): String = n match {
case x if x > 100 => "big"
case x => s"not big: $x"
}
def main(args: Array[String]): Unit = {
println(test(200))
println(test(5))
}
}Зачем нужны условия и привязка?
Вместе условия и привязки @ делают сопоставление с шаблоном выразительным:
- Условия добавляют проверки диапазонов и делимости
@сохраняет всё значение, одновременно разбирая его на части- Они делают логику ветвления компактной и понятной
Собираем всё вместе
В этом примере значение привязывается, проверяется условие и предусмотрен запасной вариант.
object Main {
def temp(c: Int): String = c match {
case t if t >= 30 => s"hot ($t)"
case t if t >= 15 => s"mild ($t)"
case t => s"cold ($t)"
}
def main(args: Array[String]): Unit = {
println(temp(35))
println(temp(20))
println(temp(5))
}
}Быстрая проверка
Проверьте своё понимание условий и привязки.
Итоги
Вы научились уточнять сопоставление:
- Условие — это условие
ifпосле шаблона - Если условие ложно, сопоставление переходит к следующему варианту
- Оператор
@привязывает всё значение, одновременно разбирая его на части - Условия сочетаются с шаблонами типов и логическими операторами
Часто задаваемые вопросы
Урок «Защитные условия и привязка» бесплатный?
Да — полный текст урока «Защитные условия и привязка» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Scala for Backend Engineering & Functional Programming, подпишись на CoddyKit PRO. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.
Чему я научусь в уроке «Защитные условия и привязка»?
Условия при сопоставлении Ты практикуешь Scala for Backend Engineering & Functional Programming с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Scala for Backend Engineering & Functional Programming?
Предыдущий опыт не требуется. Scala for Backend Engineering & Functional Programming на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Защитные условия и привязка»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Scala for Backend Engineering & Functional Programming?
Да. Каждый урок Scala for Backend Engineering & Functional Programming включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Выражения match
- Сопоставление типов и значений
- Защитные условия и привязка
- Деструктуризация