Функция
Набор функций для работы с функциями.
Анонимные функции обычно создаются с помощью 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
Оператор захвата
Также возможно захватить публичные функции модуля и передавать их как анонимные функции, используя оператор захвата Kernel.SpecialForms.&/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.13.4/Function.html