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

Деструктуризация

Извлекайте данные из структуры

«Деструктуризация» — бесплатный урок Scala for Backend Engineering & Functional Programming на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Scala for Backend Engineering & Functional Programming, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.

Что такое деконструкция?

Деконструкция (также называемая деструктуризацией) означает извлечение частей структуры данных непосредственно в шаблоне.

Вместо вызова методов доступа Вы описываете форму структуры и называете нужные части.

Деконструкция кортежа

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

object Main {
  def main(args: Array[String]): Unit = {
    val pair = ("Ada", 1815)
    val (name, year) = pair
    println(s"$name was born in $year")
  }
}

Кортежи в match

Кортеж можно деконструировать внутри match, называя каждый компонент или сопоставляя его с шаблоном.

object Main {
  def quadrant(p: (Int, Int)): String = p match {
    case (0, 0) => "origin"
    case (x, 0) => s"on x-axis at $x"
    case (0, y) => s"on y-axis at $y"
    case (x, y) => s"point ($x, $y)"
  }
  def main(args: Array[String]): Unit = {
    println(quadrant((0, 0)))
    println(quadrant((3, 0)))
    println(quadrant((2, 5)))
  }
}

Деконструкция начала списка

Оператор :: (cons) разделяет список на его первый элемент (голову) и остаток (хвост).

Шаблон head :: tail соответствует любому непустому списку.

object Main {
  def first(xs: List[Int]): String = xs match {
    case head :: tail => s"head=$head, rest=$tail"
    case Nil          => "empty"
  }
  def main(args: Array[String]): Unit = {
    println(first(List(10, 20, 30)))
    println(first(Nil))
  }
}

Сопоставление точной формы списка

Можно сопоставлять списки определённой длины, перечисляя их элементы, например List(a, b) — список ровно из двух элементов.

object Main {
  def shape(xs: List[Int]): String = xs match {
    case List()        => "none"
    case List(a)       => s"one: $a"
    case List(a, b)    => s"two: $a, $b"
    case _             => "many"
  }
  def main(args: Array[String]): Unit = {
    println(shape(List()))
    println(shape(List(1)))
    println(shape(List(1, 2)))
    println(shape(List(1, 2, 3)))
  }
}

Рекурсия с головой и хвостом

Разделение головы и хвоста позволяет удобно выполнять рекурсию по списку.

Здесь мы получаем сумму списка, складывая голову с суммой хвоста.

object Main {
  def sum(xs: List[Int]): Int = xs match {
    case Nil          => 0
    case head :: tail => head + sum(tail)
  }
  def main(args: Array[String]): Unit = {
    println(sum(List(1, 2, 3, 4)))
  }
}

Деконструкция вложенных структур

Шаблоны могут быть вложенными. Можно одновременно деконструировать кортеж внутри списка или список внутри кортежа.

object Main {
  def main(args: Array[String]): Unit = {
    val data = List(("a", 1), ("b", 2))
    data match {
      case (key, value) :: _ => println(s"first key=$key value=$value")
      case Nil               => println("empty")
    }
  }
}

Игнорирование частей с помощью _

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

object Main {
  def main(args: Array[String]): Unit = {
    val triple = (1, 2, 3)
    val (_, middle, _) = triple
    println(s"middle = $middle")
  }
}

Привязка первых двух элементов и сохранение остальных

Можно назвать первые элементы, а всё последующее сохранить с помощью шаблона хвоста.

object Main {
  def main(args: Array[String]): Unit = {
    val xs = List(1, 2, 3, 4, 5)
    xs match {
      case a :: b :: rest => println(s"a=$a b=$b rest=$rest")
      case _              => println("too short")
    }
  }
}

Зачем нужна деконструкция?

Деконструкция делает доступ к данным:

  • Декларативным: Вы описываете форму, а не последовательность действий
  • Безопасным: структура проверяется во время извлечения
  • Компактным: несколько значений привязываются одним шаблоном

С классами case она становится ещё мощнее.

Собираем всё вместе

В этом примере деконструируется список кортежей и выполняются действия в зависимости от его формы.

object Main {
  def report(scores: List[(String, Int)]): String = scores match {
    case Nil                  => "no scores"
    case (name, pts) :: Nil   => s"only $name with $pts"
    case (name, pts) :: rest  => s"top $name=$pts plus ${rest.size} more"
  }
  def main(args: Array[String]): Unit = {
    println(report(Nil))
    println(report(List(("Ann", 90))))
    println(report(List(("Ann", 90), ("Bo", 80))))
  }
}

Быстрая проверка

Проверьте своё понимание деконструкции.

Итоги

Вы научились деконструировать данные в шаблонах:

  • Кортежи разделяются с помощью (a, b)
  • Списки разделяются с помощью head :: tail или сопоставляются с точной формой, например List(a, b)
  • Nil соответствует пустому списку
  • Используйте _, чтобы игнорировать части; вкладывайте шаблоны для работы со сложными структурами
  • Разделение на голову и хвост позволяет выполнять удобную рекурсию

Часто задаваемые вопросы

Урок «Деструктуризация» бесплатный?

Да — полный текст урока «Деструктуризация» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 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 структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 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