Функция
Набор функций для работы с функциями.
Существует два типа захваченных функций: внешние и локальные. Внешние функции — это функции, находящиеся в модулях, которые захватываются с помощью &/1, такие как &String.length/1. Локальные функции — это анонимные функции, определённые с помощью fn/1 или с помощью оператора захвата &/1 с использованием &1, &2, и так далее в качестве замен.
Обзор
Типы
- information()
Функции
- capture(module, function_name, arity)
-
Захватывает заданную функцию
- info(fun)
-
Возвращает список ключевых слов с информацией о функции
- info(fun, item)
-
Возвращает определённую информацию о функции
Типы
information()
information() :: :arity | :env | :index | :module | :name | :new_index | :new_uniq | :pid | :type | :uniq
Функции
capture(module, function_name, arity) (с версии 1.7.0)
capture(module(), atom(), arity()) :: (... -> any())
Захватывает заданную функцию.
Встраивается компилятором.
Примеры
iex> Function.capture(String, :length, 1) &String.length/1
info(fun) (с версии 1.7.0)
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) (с версии 1.7.0)
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.7.4/Function.html