Просмотр протокол
Протокол Inspect преобразует структуру данных Elixir в документ алгебры.
Данная документация посвящена реализации протокола 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(map_set, opts) do
concat(["#MapSet<", to_doc(MapSet.to_list(map_set), opts), ">"])
end
end
Функция concat/1 из модуля Inspect.Algebra конкатенирует документы алгебры. В приведенном выше примере она конкатенирует строку "#MapSet<", документ, возвращаемый функцией Inspect.Algebra.to_doc/2, и конечную строку ">". Мы добавляем префикс имя модуля #, чтобы обозначить, что представление просмотра не является действительным синтаксисом Elixir.
Наконец, обратите внимание, что строки сами по себе являются допустимыми документами алгебры, которые сохраняют свой формат при красивом выводе. Это означает, что ваша реализация 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()Исходный код
@type t() :: term()
Функции
inspect(term, opts)Исходный код
@spec 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.13.4/Inspect.html