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

Функции, модули и конвейерная обработка

Научитесь определять функции, организовывать код в модули и использовать оператор конвейера для понятного преобразования данных.

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

Введение в функции в Elixir

В Эликсире функции — это строительные блоки ваших программ. Они принимают входные данные, выполняют операции и возвращают результаты.

Функции в Elixir спроектированы чистыми: они не изменяют данные за пределами своей области видимости и всегда возвращают один и тот же результат для одних и тех же входных данных. Это делает ваш код предсказуемым и простым для понимания.

Определение публичных функций

Публичные функции определяются с помощью ключевого слова def. Такие функции можно вызывать из любого места вашего приложения, если они входят в состав модуля.

Давайте создадим простую функцию, которая складывает два числа:

defmodule MathOperations do
  def add(a, b) do
    a + b
  end
end

IO.puts "Sum of 5 and 3: #{MathOperations.add(5, 3)}"

Определение приватных функций

Иногда вам нужны вспомогательные функции, которые должны использоваться только внутри модуля. Для этого используется ключевое слово defp.

Private-функции нельзя вызвать напрямую извне модуля, в котором они определены. Это помогает инкапсулировать логику.

defmodule SecretOperations do
  defp secret_add(a, b) do
    a + b + 10 # A 'secret' addition
  end

  def public_operation(x, y) do
    secret_add(x, y)
  end
end

IO.puts "Result of public operation: #{SecretOperations.public_operation(2, 3)}"
# SecretOperations.secret_add(1, 2) would cause an error if called directly outside the module.

Арность функций и клаузы

Арность (arity) — это количество аргументов, которые принимает функция. В Elixir можно определять несколько клоуз (clauses) функции с одинаковым именем, но разной арностью или разными паттернами для аргументов.

Это открывает возможности для мощного паттерн-матчинга (pattern matching, о котором говорилось в предыдущем уроке), позволяя элегантно обрабатывать различные сценарии в рамках одной функции.

defmodule Greeter do
  def greet("Alice"), do: "Hello, Alice!"
  def greet(name), do: "Hi there, #{name}!"
end

IO.puts Greeter.greet("Alice")
IO.puts Greeter.greet("Bob")

Анонимные функции

Анонимные функции (также известные как лямбды) — это функции без имени. Они часто используются, когда нужно передать функцию в качестве аргумента другой функции или для коротких одноразовых операций.

Они определяются с помощью ключевого слова fn.

adder = fn a, b -> a + b end
multiplier = fn x, y -> x * y end

IO.puts "Anonymous add: #{adder.(10, 20)}"
IO.puts "Anonymous multiply: #{multiplier.(4, 5)}"

Организация кода с модулями

Модули в Elixir представляют собой контейнеры для организации связанных функций и данных. Они помогают предотвратить конфликты имен и делают ваш код более структурированным и поддерживаемым.

Модуль определяется с помощью ключевого слова defmodule. Согласно соглашениям об именовании в Elixir, имена модулей принято начинать с заглавной буквы.

Создание первого модуля

Давайте поместим нашу функцию add внутрь модуля под названием Calculator. Это позволит четко показать, что функция add является частью набора операций, связанных с калькулятором.

defmodule Calculator do
  def add(a, b) do
    a + b
  end

  def subtract(a, b) do
    a - b
  end
end

IO.puts "Module defined!"

Вызов функций модуля

Чтобы вызвать функцию, определенную внутри модуля, нужно указать имя модуля, затем поставить точку (.), а после написать имя функции вместе с ее аргументами.

Такое явное именование помогает понять, откуда именно берется функция.

defmodule Calculator do
  def add(a, b), do: a + b
  def subtract(a, b), do: a - b
end

IO.puts "10 + 5 = #{Calculator.add(10, 5)}"
IO.puts "10 - 5 = #{Calculator.subtract(10, 5)}"

Знакомство с оператором конвейера `|>`

Оператор конвейера |> — одна из самых любимых возможностей Elixir. Он делает цепочки вызовов функций невероятно читаемыми, последовательно передавая данные из одной функции в другую.

Представьте это так: результат выражения слева подставляется в качестве первого аргумента в вызов функции справа.

Применение конвейеров на практике

Вместо вложенных вызовов функций вроде function_c(function_b(function_a(data))), оператор пайпа позволяет записать это так: data |> function_a() |> function_b() |> function_c().

Это читается как последовательность шагов, делая сложные трансформации данных гораздо более наглядными.

defmodule DataProcessor do
  def double(x), do: x * 2
  def add_five(x), do: x + 5
  def to_string(x), do: to_string(x)
end

result = 10 
         |> DataProcessor.double() 
         |> DataProcessor.add_five() 
         |> DataProcessor.to_string()

IO.puts "Processed result: #{result}"

Проверьте свои знания

Какие из следующих утверждений об анонимных функциях, модулях и операторе конвейера (pipe operator) в Elixir верны?

Итоги: функции, модули и пайпы

Отличная работа! В этом уроке вы изучили основы организации и трансформации данных в Elixir:

  • Как определять публичные (`def`) и приватные (`defp`) функции.
  • Важность модулей (`defmodule`) для структурирования кода.
  • Как оператор pipe (`|>`) значительно улучшает читаемость последовательных преобразований данных.

Эти концепции лежат в основе написания понятных, поддерживаемых и функциональных приложений на Elixir. Продолжайте практиковаться!

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

Урок «Функции, модули и конвейерная обработка» бесплатный?

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

Чему я научусь в уроке «Функции, модули и конвейерная обработка»?

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

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

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

Сколько времени занимает урок «Функции, модули и конвейерная обработка»?

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

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

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

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

  1. Функции, модули и конвейерная обработка
  2. Работа с перечисляемыми коллекциями
  3. Рекурсия и функции высшего порядка
  4. Ленивые вычисления с модулем Stream
← Назад к Elixir & Phoenix: Scalable Backend Development