Функции, модули и конвейерная обработка
Научитесь определять функции, организовывать код в модули и использовать оператор конвейера для понятного преобразования данных.
«Функции, модули и конвейерная обработка» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Функции, модули и конвейерная обработка
- Работа с перечисляемыми коллекциями
- Рекурсия и функции высшего порядка
- Ленивые вычисления с модулем Stream