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