English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Erlang — это широко известный функциональный языков программирования, поэтому вы увидите много внимания уделяется тому, как функции работают в Erlang. Эта глава рассказывает, как использовать функции в Erlang для выполнения всех операций.
Грамматика объявления функции такова:
FunctionName(Pattern1… PatternN) -> Body;
Здесь:
FunctionName − Имя функции является атомом (уникальность)
Pattern1… PatternN − Каждому параметру соответствует шаблон. Количество параметров N равно количеству параметров функции. Имя функции уникально для модуля, имени функции и количества определяемых параметров. Например, две функции с одинаковым именем в одном и том же модуле, но с разным количеством параметров, также считаются двумя различными функциями.
Body − Тело подявления состоит из последовательности выражений, разделенных запятыми (,)
Следующая программа является простым примером использования функции -
-module(helloworld). -export([add/2,start/0]). add(X,Y) -> Z = X+Y, io:fwrite("~w~n",[Z]). start() -> add(5,6).
Следующие моменты需要注意 в отношении вышеуказанной программы -
Мы определяем две функции, одну из которых является add и требует 2 параметров, другая функция — start;
Эти функции определены с помощью функции export. Если мы этого не сделаем, то функции не будут использоваться;
Функция может быть вызывается в другой функции. В данном случае функция start вызывает функцию add;
Результат выполнения кода -
11
Анонимная функция
Анонимная функция — это функция, которая не связана с żadным именем. В Erlang есть инструменты, которые можно использовать для определения анонимных функций. Следующая программа является примером анонимной функции.
-module(helloworld). -export([start/0]). start() -> Fn = fun() -> io:fwrite("Anonymous Function") end, Fn().
Для примера, приведенного выше,应注意 следующие моменты -
Анонимные функции определяются с помощью ключевого слова fun()
Эта функция назначается переменной с именем Fn
Эта функция вызывается по имени переменной
Результат выполнения кода -
Анонимная функция
Функция с несколькими параметрами
Функции Erlang могут быть определены с нуля или несколькими параметрами. Дублирование функций также возможно, можно определить функцию с таким же именем, только если они имеют разное количество параметров. В следующем примере каждая функция demo определена с использованием нескольких параметров.
-module(helloworld). -export([add/2,add/3,start/0]). add(X,Y) -> Z = X+Y, io:fwrite("~w~n",[Z]). add(X,Y,Z) -> A = X+Y+Z, io:fwrite("~w~n",[A]). start() -> add(5,6), add(5,6,6).
В предыдущем примере программы мы дважды определяем функцию add. Но определение первой функции add использует два параметра, определение второй функции add использует три параметра.
Результат выполнения кода -
11 17
Функция использует последовательность
В Erlang функции также имеют возможность защиты последовательности. Это не является чем-то особенным, это всего лишь выражение, которое выполняется только при оценке (вычислении) в true.
Использование грамматики функции защиты последовательности показано в следующем примере программы.
FunctionName(Pattern1… PatternN) [when GuardSeq1]-> Body;
Здесь:
FunctionName − Имя функции является атомом (уникальность)
Pattern1… PatternN − Каждому параметру соответствует шаблон. Количество параметров N равно количеству параметров функции. Имя функции уникально для модуля, имени функции и количества определяемых параметров. Например, две функции с одинаковым именем в одном и том же модуле, но с разным количеством параметров, также считаются двумя различными функциями.
Body − Тело подявления состоит из последовательности выражений, разделенных запятыми (,)
GuardSeq1 − Когда функция вызывается, она получает выражение для вычисления.
Ниже приведен пример программы, которая является простой реализацией функции с защитной последовательностью.
-module(helloworld). -export([add/1,start/0]). add(X) when X>3 -> io:fwrite("~w~n",[X]). start() -> add(4).
Результат выполнения кода -
4
Если функция add вызывается как add(3), программа покажет ошибку.