Функция — это набор операторов, организованных вместе для выполнения определенной задачи. Функции в программировании работают в основном как функции в математике. Вы даете функциям некоторый ввод, они генерируют вывод на основе предоставленного ввода.
В эликсире есть 2 типа функций —
Анонимная функция
Функции, определенные с использованием конструкции fn..end, являются анонимными функциями. Эти функции иногда также называют лямбдами. Они используются путем присвоения им имен переменных.
Именованная функция
Функции, определенные с помощью ключевого слова def , называются функциями. Это встроенные функции в Elixir.
Анонимные функции
Как следует из названия, анонимная функция не имеет имени. Они часто передаются другим функциям. Чтобы определить анонимную функцию в Elixir, нам нужны ключевые слова fn и end . Внутри них мы можем определить любое количество параметров и тел функций, разделенных -> . Например,
sum = fn (a, b) -> a + b end IO.puts(sum.(1, 5))
При запуске вышеупомянутой программы, она генерирует следующий результат —
6
Обратите внимание, что эти функции не вызываются как именованные функции. У нас есть ‘ . ‘между именем функции и ее аргументами.
Использование оператора захвата
Мы также можем определить эти функции, используя оператор захвата. Это более простой способ создания функций. Теперь мы определим вышеуказанную функцию суммы с помощью оператора захвата,
sum = &(&1 + &2) IO.puts(sum.(1, 2))
Когда вышеуказанная программа запускается, она генерирует следующий результат —
3
В сокращенной версии наши параметры не названы, но доступны для нас как & 1, & 2, & 3 и так далее.
Функции сопоставления с образцом
Сопоставление с образцом не ограничивается только переменными и структурами данных. Мы можем использовать сопоставление с образцом, чтобы сделать наши функции полиморфными. Например, мы объявим функцию, которая может принимать 1 или 2 входа (в кортеже) и выводить их на консоль,
handle_result = fn {var1} -> IO.puts("#{var1} found in a tuple!") {var_2, var_3} -> IO.puts("#{var_2} and #{var_3} found!") end handle_result.({"Hey people"}) handle_result.({"Hello", "World"})
Когда вышеуказанная программа запущена, она дает следующий результат —
Hey people found in a tuple! Hello and World found!
Именованные функции
Мы можем определять функции с именами, чтобы мы могли легко ссылаться на них позже. Именованные функции определяются внутри модуля с помощью ключевого слова def. Именованные функции всегда определяются в модуле. Для вызова именованных функций нам нужно ссылаться на них, используя их имя модуля.
Ниже приведен синтаксис для именованных функций —
def function_name(argument_1, argument_2) do #code to be executed when function is called end
Давайте теперь определим нашу именованную функцию sum в модуле Math.
defmodule Math do def sum(a, b) do a + b end end IO.puts(Math.sum(5, 6))
При запуске над программой она выдает следующий результат —
11
Для функций с 1 строкой существует сокращенная запись, чтобы определить эти функции, используя do:. Например —
defmodule Math do def sum(a, b), do: a + b end IO.puts(Math.sum(5, 6))
При запуске над программой она выдает следующий результат —
11
Частные функции
Elixir предоставляет нам возможность определять частные функции, к которым можно получить доступ из модуля, в котором они определены. Чтобы определить приватную функцию, используйте defp вместо def . Например,
defmodule Greeter do def hello(name), do: phrase <> name defp phrase, do: "Hello " end Greeter.hello("world")
Когда вышеуказанная программа запущена, она дает следующий результат —
Hello world
Но если мы просто попытаемся явно вызвать функцию фразы, используя функцию Greeter.phrase () , это вызовет ошибку.
Аргументы по умолчанию
Если нам нужно значение по умолчанию для аргумента, мы используем синтаксис аргумента \\ value —
defmodule Greeter do def hello(name, country \\ "en") do phrase(country) <> name end defp phrase("en"), do: "Hello, " defp phrase("es"), do: "Hola, " end Greeter.hello("Ayush", "en") Greeter.hello("Ayush") Greeter.hello("Ayush", "es")
Когда вышеуказанная программа запущена, она дает следующий результат —