Spec-Zone.ru › Elixir 1.5

Протокол

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

Обзор

Функции

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}

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

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

Spec-Zone.ru

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