Spec-Zone.ru › Elixir 1.10

Инспекция протокола

Протокол Inspect преобразует структуру данных Elixir в документ алгебры.

Это руководство посвящено реализации протокола Inspect для собственных структур данных. Чтобы узнать больше об использовании inspect, см. Kernel.inspect/2 и IO.inspect/2.

Функция inspect/2 получает проверяемую сущность и параметры проверки, представленные структурой Inspect.Opts. Построение документа алгебры выполняется с помощью Inspect.Algebra.

Примеры

Зачастую инспекция структуры может быть реализована с использованием существующих сущностей. Например, вот реализация MapSet для inspect/2:

defimpl Inspect, for: MapSet do
  import Inspect.Algebra

  def inspect(dict, opts) do
    concat(["#MapSet<", to_doc(MapSet.to_list(dict), opts), ">"])
  end
end

Функция concat/1 из Inspect.Algebra конкатенирует документы алгебры. В примере выше она конкатенирует строку "MapSet<", документ, возвращаемый Inspect.Algebra.to_doc/2, и окончательную строку ">". Все строки являются допустимыми документами алгебры, которые сохраняют свой форматирование при красивом выводе.

Так как обычные строки являются допустимыми сущностями в документе алгебры, реализация протокола Inspect может просто вернуть строку, хотя это лишит её возможности красивого вывода.

Обработка ошибок

В случае ошибки при проверке структуры Elixir поднимет ошибку ArgumentError и автоматически вернется к исходному представлению для вывода структуры.

Однако вы можете получить доступ к базовой ошибке, вызвав реализацию Inspect напрямую. Например, для тестирования Inspect.MapSet выше, вы можете вызвать её так:

Inspect.MapSet.inspect(MapSet.new(), %Inspect.Opts{})

Наследование

Протокол Inspect может быть унаследован, чтобы скрыть определенные поля из структур, чтобы они не отображались в логах, результатах инспекции и подобном. Это особенно полезно для полей, содержащих конфиденциальную информацию.

Параметры :only и :except могут быть использованы с @derive для указания, какие поля должны и не должны отображаться в документе алгебры:

defmodule User do
  @derive {Inspect, only: [:id, :name]}
  defstruct [:id, :name, :address]
end

inspect(%User{id: 1, name: "Homer", address: "742 Evergreen Terrace"})
#=> #User<id: 1, name: "Homer", ...>

Резюме

Типы

t()

Функции

inspect(term, opts)

Преобразует term в документ алгебры.

Типы

t()

Specs

t() :: term()

Функции

inspect(term, opts)

Specs

inspect(t(), Inspect.Opts.t()) :: Inspect.Algebra.t()

Преобразует term в документ алгебры.

Эту функцию не следует вызывать напрямую, если только вы не реализуете пользовательский протокол inspect_fun для передачи в Inspect.Opts. Во всех остальных случаях следует использовать Inspect.Algebra.to_doc/2, так как она обрабатывает структуры и исключения.

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

Spec-Zone.ru

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