Spec-Zone.ru › Elixir 1.17

Исходный код Функция

Набор функций для работы с функциями.

Анонимные функции обычно создаются с помощью 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, для проверки, является ли заданное значение функцией или функцией заданной арности соответственно.

Сводка

Типы

information()

Функции

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()) :: (... -> any())

Захватывает заданную функцию.

Встраивается компилятором.

Примеры

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((... -> 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(функция, элемент)Исходный код

@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}

Скачать версию ePub

Создано с помощью ExDoc (v0.34.1) для Elixir

© 2012-2024 The Elixir Team
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.17.2/Function.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API