Функция
Набор функций для работы с функциями.
Анонимные функции обычно создаются с использованием fn:
iex> add = fn a, b -> a + b end iex> add.(1, 2) 3
Анонимные функции также могут иметь несколько разделов. Все разделы должны ожидать одинаковое количество аргументов:
iex> negate = fn ...> true -> false ...> false -> true ...> end iex> negate.(false) true
Оператор захвата
Также возможно захватить общедоступные модульные функции и передавать их как анонимные функции, используя оператор захвата &/1:
iex> add = &Kernel.+/2
iex> add.(1, 2)
3
iex> length = &String.length/1
iex> length.("hello")
5
Для захвата определения в текущем модуле можно опустить префикс модуля, например, &my_fun/2. В этих случаях захваченная функция может быть общедоступной (def) или приватной (defp).
Оператор захвата также может использоваться для создания анонимных функций, которые ожидают по меньшей мере один аргумент:
iex> add = &(&1 + &2) iex> add.(1, 2) 3
В таких случаях использование оператора захвата ничем не отличается от использования fn.
Внутренние и внешние функции
Функции, которые ссылаются на определения, находящиеся в модулях, например, &String.length/1, называются внешними функциями. Все остальные функции являются локальными и всегда связаны с файлом или модулем, которые их определили.
Помимо функций в этом модуле для работы с функциями, в Kernel также есть функция apply/2, которая вызывает функцию с динамическим количеством аргументов, а также is_function/1 и is_function/2 для проверки того, является ли данное значение функцией или функцией заданной арности.
Краткое описание
Типы
Функции
- capture(module, function_name, arity)
Захватывает заданную функцию.
- identity(value)
Возвращает свой вход
value. Эта функция может быть передана как анонимная функция в функции преобразования.- info(fun)
Возвращает список ключевых слов с информацией о функции.
- info(fun, item)
Возвращает определённую информацию о функции.
Типы
information()Исходный код
@type information() :: :arity | :env | :index | :module | :name | :new_index | :new_uniq | :pid | :type | :uniq
Функции
capture(module, function_name, arity)Исходный код
@spec capture(module(), atom(), arity()) :: (... -> any())
Захватывает заданную функцию.
Встроено компилятором.
Примеры
iex> Function.capture(String, :length, 1) &String.length/1
identity(value)Исходный код
@spec identity(value) :: value when value: var
Возвращает свой вход value. Эта функция может быть передана как анонимная функция в функции преобразования.
Примеры
iex> Function.identity("Hello world!")
"Hello world!"
iex> 'abcdaabccc' |> Enum.sort() |> Enum.chunk_by(&Function.identity/1)
['aaa', 'bb', 'cccc', 'd']
iex> Enum.group_by('abracadabra', &Function.identity/1)
%{97 => 'aaaaa', 98 => 'bb', 99 => 'c', 100 => 'd', 114 => 'rr'}
iex> Enum.map([1, 2, 3, 4], &Function.identity/1)
[1, 2, 3, 4] info(fun)Исходный код
@spec info((... -> any())) :: [{information(), term()}] Возвращает список ключевых слов с информацией о функции.
Возвращаемые ключи (с соответствующими возможными значениями) для всех типов функций (локальных и внешних) следующие:
:type-:local(для анонимных функций) или:external(для именованных функций).:module- атом, являющийся модулем, в котором определена функция, когда она анонимная, или модулем, на который ссылается функция, когда она именованная.:arity- (целое число) количество аргументов, с которыми должна быть вызвана функция.:name- (атом) имя функции.:env- список среды или свободных переменных. Для именованных функций возвращаемый список всегда пустой.
Когда fun является анонимной функцией (то есть, тип является :local), возвращаются следующие дополнительные ключи:
:pid- PID процесса, который первоначально создал функцию.:index- (целое число) индекс в таблице функций модуля.:new_index- (целое число) индекс в таблице функций модуля.:new_uniq- (двоичное представление) уникальное значение для этой функции. Вычисляется на основе скомпилированного кода для всего модуля.:uniq- (целое число) уникальное значение для этой функции. Это целое число вычисляется из скомпилированного кода для всего модуля.
Примечание: эту функцию следует использовать только для отладки.
Встроено компилятором.
Примеры
iex> fun = fn x -> x end iex> info = Function.info(fun) iex> Keyword.get(info, :arity) 1 iex> Keyword.get(info, :type) :local iex> fun = &String.length/1 iex> info = Function.info(fun) iex> Keyword.get(info, :type) :external iex> Keyword.get(info, :name) :length
info(fun, item)Исходный код
@spec info((... -> any()), item) :: {item, term()} when item: information() Возвращает определённую информацию о функции.
Возвращаемая информация — кортеж из двух элементов в формате {info, value}.
Для любой функции запрашиваемая информация может быть одним из атомов :module, :name, :arity, :env, или :type.
Для анонимных функций также есть информация об атомах :index, :new_index, :new_uniq, :uniq, и :pid . Для именованной функции значение любого из этих элементов всегда атом :undefined.
Для получения дополнительной информации о каждом из возможных возвращаемых значений, см. info/1.
Встроено компилятором.
Примеры
iex> f = fn x -> x end
iex> Function.info(f, :arity)
{:arity, 1}
iex> Function.info(f, :type)
{:type, :local}
iex> fun = &String.length/1
iex> Function.info(fun, :name)
{:name, :length}
iex> Function.info(fun, :pid)
{:pid, :undefined}
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.14.1/Function.html