当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Elixir Inspect用法及代码示例


Elixir语言中 Inspect 相关用法介绍如下。

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 实现可能只是返回一个字符串,尽管这将没有任何pretty-printing。

错误处理

如果在检查您的结构时出现错误,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", ...>

相关用法


注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Inspect。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。