Функция
Набор функций для работы с функциями.
Анонимные функции обычно создаются с помощью fn:
iex> add = fn a, b -> a + b end iex> add.(1, 2) 3
Также можно захватить функции модуля и передавать их как анонимные функции, используя оператор захвата &/1:
iex> add = &Kernel.+/2
iex> add.(1, 2)
3
iex> length = &String.length/1
iex> length.("hello")
5
Также можно захватить определение в текущем модуле, пропустив префикс модуля, например, &my_fun/2.
Оператор захвата также может использоваться для создания анонимных функций, которые ожидают как минимум один аргумент:
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()
Спецификации
information() :: :arity | :env | :index | :module | :name | :new_index | :new_uniq | :pid | :type | :uniq
Функции
capture(module, function_name, arity)
Спецификации
capture(module(), atom(), arity()) :: (... -> any())
Захватывает заданную функцию.
Встраивается компилятором.
Примеры
iex> Function.capture(String, :length, 1) &String.length/1
identity(value)
Спецификации
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)
Спецификации
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)
Спецификации
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.10.4/Function.html