Просмотр протокола
Протокол 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", ...> Краткое описание
Типы
Функции
- inspect(term, opts)
Преобразует
termв документ алгебры.
Типы
t()
Спецификации
t() :: term()
Функции
inspect(term, opts)
Спецификации
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.9.4/Inspect.html