Протокол
Функции для работы с протоколами.
Краткое описание
Функции
- 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