0Pricing
Elixir & Phoenix: Scalable Backend Development · Урок

Сопоставление с образцом и управление потоком

Освойте мощную возможность сопоставления с образцом в Elixir и основные конструкции управления потоком, такие как `if`, `case` и `cond`.

«Сопоставление с образцом и управление потоком» — бесплатный урок Elixir & Phoenix: Scalable Backend Development на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Elixir & Phoenix: Scalable Backend Development, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Elixir & Phoenix: Scalable Backend Development содержит 4 уроков всего.

Введение в сопоставление с образцом

Паттерн-матчинг — это сердце Эликсира. Здесь = — это оператор сопоставления, а не присваивания: он заставляет левую сторону соответствовать правой.

Базовое сопоставление переменных

Самое простое сопоставление связывает несвязанную переменную со значением. Если она уже связана, Elixir вместо этого проверяет, действительно ли обе стороны совпадают.

defmodule BasicMatchDemo do
  def run do
    # 'a' is unbound, so it's assigned 10
    a = 10
    IO.puts "a is: #{a}"

    # 'b' is unbound, so it's assigned 20
    b = 20
    IO.puts "b is: #{b}"

    # This matches 'a' to the value of 'b' (20)
    # 'a' is re-bound to 20
    a = b
    IO.puts "After a = b, a is: #{a}"
  end
end

BasicMatchDemo.run()

Сопоставление с литералами

Поместите литерал слева, и оператор сопоставления превратится в assertion: он завершится успешно, только если обе стороны равны, в противном случае будет выброшена ошибка. Это очень удобно для валидации.

defmodule LiteralMatchDemo do
  def run do
    # This matches because 1 is equal to 1
    1 = 1
    IO.puts "1 = 1 matched successfully!"

    # This matches because 'hello' is equal to 'hello'
    "hello" = "hello"
    IO.puts "'hello' = 'hello' matched successfully!"

    # If you uncomment the line below, it will cause a MatchError
    # 1 = 2
    # IO.puts "This line would not be reached if 1 = 2 failed"
  end
end

LiteralMatchDemo.run()

Распаковка кортежей

Сопоставление с образцом отлично подходит для работы с кортежами: деконструируйте их прямо в переменные. Именно так распаковываются результаты вроде {:ok, value}.

defmodule TupleMatchDemo do
  def run do
    # Match a tuple to extract its elements
    {:person, name, age} = {:person, "Alice", 30}
    IO.puts "Name: #{name}, Age: #{age}"

    # Match a common result tuple
    {:ok, data} = {:ok, "User fetched successfully"}
    IO.puts "Status: ok, Data: #{data}"

    # If you uncomment the line below, it will cause a MatchError
    # {:error, reason} = {:ok, "Success"}
  end
end

TupleMatchDemo.run()

Деконструкция списков

Деконструируйте списки с помощью паттерна [head | tail]: head — это первый элемент, а tail — остальные. Используйте _ для частей, которые вам не важны.

defmodule ListMatchDemo do
  def run do
    list = [1, 2, 3, 4, 5]

    # Match head and tail
    [head | tail] = list
    IO.puts "Head: #{head}, Tail: #{inspect tail}"

    # Match specific elements
    [first, second, third | _rest] = list
    IO.puts "First: #{first}, Second: #{second}, Third: #{third}"

    # Match an empty list
    [] = []
    IO.puts "Empty list matched!"
  end
end

ListMatchDemo.run()

Оператор pin (^)

Оператор пин ^ говорит интерпретатору: «не перепривязывай значение — сопоставь с текущим значением этой переменной». Отлично подходит для проверки на равенство.

defmodule PinOperatorDemo do
  def run do
    value_a = 10
    value_b = 10

    # This uses the current value of value_a (10) to match against value_b
    # It succeeds because 10 matches 10
    ^value_a = value_b
    IO.puts "Match successful: value_a = #{value_a}, value_b = #{value_b}"

    value_c = 5

    # If you uncomment the line below, it will cause a MatchError
    # because ^value_a (10) is not equal to value_c (5)
    # ^value_a = value_c
    # IO.puts "This line would not be reached if ^value_a = value_c failed"
  end
end

PinOperatorDemo.run()

Простые условные конструкции: if/unless

Для простых ветвлений используйте if и его противоположность unless, каждый из которых поддерживает необязательную ветку else. Это самый аккуратный инструмент для одного условия истинно/ложно.

defmodule IfUnlessDemo do
  def run do
    number = 7

    if number > 5 do
      IO.puts "Number is greater than 5"
    else
      IO.puts "Number is 5 or less"
    end

    unless rem(number, 2) == 0 do
      IO.puts "Number is odd"
    else
      IO.puts "Number is even"
    end
  end
end

IfUnlessDemo.run()

Обработка нескольких паттернов с помощью case

Выражение case сопоставляет одно значение с несколькими паттернами и выполняет код первого подошедшего — паттерн-матчинг в роли управления потоком выполнения.

defmodule CaseExpressionDemo do
  def run do
    status = {:ok, "Data loaded"}

    case status do
      {:ok, message} ->
        IO.puts "Success: #{message}"
      {:error, reason} ->
        IO.puts "Failed: #{reason}"
      _ ->
        IO.puts "Unknown status"
    end

    # Another example with a simple value
    grade = "B"
    case grade do
      "A" -> IO.puts "Excellent!"
      "B" -> IO.puts "Good job!"
      _ -> IO.puts "Keep trying!"
    end
  end
end

CaseExpressionDemo.run()

Несколько условий с cond

Когда вам нужно проверить множество условий (как цепочка if/else-if в других языках), cond выполняет первую ветку, условие которой истинно.

defmodule CondExpressionDemo do
  def run do
    score = 85

    cond do
      score >= 90 -> IO.puts "Grade: A"
      score >= 80 -> IO.puts "Grade: B"
      score >= 70 -> IO.puts "Grade: C"
      true -> IO.puts "Grade: D or lower" # The 'true' clause acts as a catch-all
    end

    temperature = 25
    cond do
      temperature > 30 -> IO.puts "It's hot!"
      temperature > 20 -> IO.puts "It's warm."
      true -> IO.puts "It's cool."
    end
  end
end

CondExpressionDemo.run()

Задача на сопоставление с образцом

Посмотрите на следующий фрагмент кода на Elixir:

data = ["apple", {:fruit, "banana"}, "cherry"]
[first, {:fruit, second}, _] = data

Каковы будут итоговые значения переменных first и second после выполнения этого кода?

Итоги: Pattern Matching и control flow

Итоги: = сопоставляет, вы распаковываете кортежи и списки, ^ фиксирует значение, а if/case/cond управляют ходом выполнения.

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

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

Да — полный текст урока «Сопоставление с образцом и управление потоком» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Elixir & Phoenix: Scalable Backend Development, подпишись на CoddyKit PRO. Курс Elixir & Phoenix: Scalable Backend Development содержит 4 уроков всего.

Чему я научусь в уроке «Сопоставление с образцом и управление потоком»?

Освойте мощную возможность сопоставления с образцом в Elixir и основные конструкции управления потоком, такие как `if`, `case` и `cond`. Ты практикуешь Elixir & Phoenix: Scalable Backend Development с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Elixir & Phoenix: Scalable Backend Development?

Предыдущий опыт не требуется. Elixir & Phoenix: Scalable Backend Development на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Сопоставление с образцом и управление потоком»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Elixir & Phoenix: Scalable Backend Development?

Да. Каждый урок Elixir & Phoenix: Scalable Backend Development включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. Введение в язык Elixir
  2. Основные типы данных и операторы
  3. Сопоставление с образцом и управление потоком
  4. Строки, двоичные данные и сигилы в Elixir
← Назад к Elixir & Phoenix: Scalable Backend Development