0Pricing
Scala for Backend Engineering & Functional Programming · Урок

Защитные условия и привязка

Условия при сопоставлении

«Защитные условия и привязка» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Выражения match
  2. Сопоставление типов и значений
  3. Защитные условия и привязка
  4. Деструктуризация
← Назад к Scala for Backend Engineering & Functional Programming