Учебники

Эликсир — Функции

Функция — это набор операторов, организованных вместе для выполнения определенной задачи. Функции в программировании работают в основном как функции в математике. Вы даете функциям некоторый ввод, они генерируют вывод на основе предоставленного ввода.

В эликсире есть 2 типа функций —

Анонимная функция

Функции, определенные с использованием конструкции fn..end, являются анонимными функциями. Эти функции иногда также называют лямбдами. Они используются путем присвоения им имен переменных.

Именованная функция

Функции, определенные с помощью ключевого слова def , называются функциями. Это встроенные функции в Elixir.

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

Как следует из названия, анонимная функция не имеет имени. Они часто передаются другим функциям. Чтобы определить анонимную функцию в Elixir, нам нужны ключевые слова fn и end . Внутри них мы можем определить любое количество параметров и тел функций, разделенных -> . Например,

Live Demo

sum = fn (a, b) -> a + b end
IO.puts(sum.(1, 5))

При запуске вышеупомянутой программы, она генерирует следующий результат —

6

Обратите внимание, что эти функции не вызываются как именованные функции. У нас есть ‘ . ‘между именем функции и ее аргументами.

Использование оператора захвата

Мы также можем определить эти функции, используя оператор захвата. Это более простой способ создания функций. Теперь мы определим вышеуказанную функцию суммы с помощью оператора захвата,

Live Demo

sum = &(&1 + &2) 
IO.puts(sum.(1, 2))

Когда вышеуказанная программа запускается, она генерирует следующий результат —

3

В сокращенной версии наши параметры не названы, но доступны для нас как & 1, & 2, & 3 и так далее.

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

Сопоставление с образцом не ограничивается только переменными и структурами данных. Мы можем использовать сопоставление с образцом, чтобы сделать наши функции полиморфными. Например, мы объявим функцию, которая может принимать 1 или 2 входа (в кортеже) и выводить их на консоль,

Live Demo

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.

Live Demo

defmodule Math do
   def sum(a, b) do
      a + b
   end
end

IO.puts(Math.sum(5, 6))

При запуске над программой она выдает следующий результат —

11

Для функций с 1 строкой существует сокращенная запись, чтобы определить эти функции, используя do:. Например —

Live Demo

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")

Когда вышеуказанная программа запущена, она дает следующий результат —