Исходный код Функция
Набор функций для работы с функциями.
Анонимные функции обычно создаются с помощью 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(модуль, имя_функции, арность)
Захватывает заданную функцию.
- identity(значение)
Возвращает свой вход
value. Эта функция может быть передана как анонимная функция в функции преобразования.- info(функция)
Возвращает список ключевых слов с информацией о функции.
- info(функция, элемент)
Возвращает определённую информацию о функции.
Типы
information()Исходный код
@type information() :: :arity | :env | :index | :module | :name | :new_index | :new_uniq | :pid | :type | :uniq
Функции
capture(модуль, имя_функции, арность)Исходный код
@spec capture(module(), atom(), arity()) :: fun()
Захватывает заданную функцию.
Встраивается компилятором.
Примеры
iex> Function.capture(String, :length, 1) &String.length/1
identity(значение)Исходный код
@spec identity(value) :: value when value: var
Возвращает свой вход value. Эта функция может быть передана как анонимная функция в функции преобразования.
Примеры
iex> Function.identity("Hello world!")
"Hello world!"
iex> ~c"abcdaabccc" |> Enum.sort() |> Enum.chunk_by(&Function.identity/1)
[~c"aaa", ~c"bb", ~c"cccc", ~c"d"]
iex> Enum.group_by(~c"abracadabra", &Function.identity/1)
%{97 => ~c"aaaaa", 98 => ~c"bb", 99 => ~c"c", 100 => ~c"d", 114 => ~c"rr"}
iex> Enum.map([1, 2, 3, 4], &Function.identity/1)
[1, 2, 3, 4] info(функция)Исходный код
@spec info(fun()) :: [{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(функция, элемент)Исходный код
@spec info(fun(), 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-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.18.1/Function.html