Протокол
Функции для работы с протоколами.
Обзор
Функции
- 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.3.4/Protocol.html