Spec-Zone.ru › Elixir 1.4

Протокол

Функции для работы с протоколами.

Краткое описание

Функции

assert_impl!(protocol, base)

Проверяет, загружен ли указанный модуль и является ли он реализацией данного протокола

assert_protocol!(module)

Проверяет, загружен ли указанный модуль и является ли он протоколом

consolidate(protocol, types)

Принимает протокол и список реализаций и консолидирует данный протокол

consolidated?(protocol)

Возвращает true если протокол был консолидирован

def(signature)

Определяет новую функцию протокола

derive(protocol, module, options \\ [])

Выводит protocol для module с заданными параметрами

extract_impls(protocol, paths)

Извлекает все типы, реализованные для данного протокола из заданных путей

extract_protocols(paths)

Извлекает все протоколы из заданных путей

Функции

assert_impl!(protocol, base)

assert_impl!(module(), module()) :: :ok | no_return()

Проверяет, загружен ли указанный модуль и является ли он реализацией данного протокола.

Возвращает :ok в случае успеха, иначе вызывает ArgumentError.

assert_protocol!(module)

assert_protocol!(module()) :: :ok | no_return()

Проверяет, загружен ли указанный модуль и является ли он протоколом.

Возвращает :ok в случае успеха, иначе вызывает ArgumentError.

consolidate(protocol, types)

consolidate(module(), [module()]) ::
  {:ok, binary()} |
  {:error, :not_a_protocol} |
  {:error, :no_beam_info}

Принимает протокол и список реализаций и консолидирует данный протокол.

Консолидация происходит путем изменения представлений протокола impl_for в абстрактном формате для быстрого поиска. Список реализаций, используемых во время консолидации, обычно извлекается с помощью extract_impls/2.

Возвращает обновлённую версию байткода протокола. Можно проверить, был ли консолидирован байткод или реализация протокола, проанализировав атрибут протокола:

Protocol.consolidated?(Enumerable)

Если первый элемент кортежа равен true, это означает, что протокол был консолидирован.

Эта функция не загружает протокол и не загружает новый байткод для скомпилированного модуля. Однако каждая реализация должна быть доступна и будет загружена.

consolidated?(protocol)

consolidated?(module()) :: boolean()

Возвращает true если протокол был консолидирован.

def(signature) (макрос)

Определяет новую функцию протокола.

Протоколы не позволяют определять функции напрямую, вместо этого обычные Kernel.def/* макросы заменяются этим макросом, который определяет функции протокола с соответствующими обратными вызовами.

derive(protocol, module, options \\ []) (макрос)

Выводит protocol для module с заданными параметрами.

extract_impls(protocol, paths)

extract_impls(module(), [charlist() | String.t()]) :: [atom()]

Извлекает все типы, реализованные для данного протокола из заданных путей.

Пути могут быть строками или списками. Внутренне они обрабатываются как списки, поэтому передача их в виде списков избегает дополнительных преобразований.

Не загружает ни одной из реализаций.

Примеры

# Get Elixir's ebin and retrieve all protocols
iex> path = :code.lib_dir(:elixir, :ebin)
iex> mods = Protocol.extract_impls(Enumerable, [path])
iex> List in mods
true

extract_protocols(paths)

extract_protocols([charlist() | String.t()]) :: [atom()]

Извлекает все протоколы из заданных путей.

Пути могут быть строками или списками. Внутренне они обрабатываются как списки, поэтому передача их в виде списков избегает дополнительных преобразований.

Не загружает ни один из протоколов.

Примеры

# Get Elixir's ebin and retrieve all protocols
iex> path = :code.lib_dir(:elixir, :ebin)
iex> mods = Protocol.extract_protocols([path])
iex> Enumerable in mods
true

© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.4.5/Protocol.html

Spec-Zone.ru

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