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


Elixir Kernel.SpecialForms.%struct{}用法及代码示例


Elixir语言中 Kernel.SpecialForms.%struct{} 相关用法介绍如下。

用法:

%struct{}
(宏)

匹配或构建结构。

结构是一个标记的映射,它允许开发人员为键提供默认值,标签用于多态调度和编译时断言。

结构通常使用 Kernel.defstruct/1 宏定义:

defmodule User do
  defstruct name: "john", age: 27
end

现在可以按如下方式创建结构:

%User{}

结构下面只是一个映射,其中 :__struct__ 键指向 User 模块:

%User{} == %{__struct__: User, name: "john", age: 27}

在构建结构时可以给出结构字段:

%User{age: 31}
#=> %{__struct__: User, name: "john", age: 31}

或者也可以在模式匹配上提取值:

%User{age: age} = user

还可以使用特定于结构的更新操作:

%User{user | age: 28}

结构的优点是它们验证给定的键是定义结构的一部分。下面的示例将失败,因为 User 结构中没有键 :full_name

%User{full_name: "john doe"}

上面的语法将保证给定的键在编译时是有效的,它会保证在运行时给定的参数是一个结构,否则会以 BadStructError 失败。

尽管结构是映射,但默认情况下结构不实现为映射实现的任何协议。检查 Kernel.defprotocol/2 以获取有关如何将结构与协议一起用于多态调度的更多信息。另请参阅 Kernel.struct/2 Kernel.struct!/2 ,了解有关如何动态创建和更新结构的示例。

结构名称的模式匹配

除了允许对结构字段进行模式匹配,例如:

%User{age: age} = user

结构还允许对结构名称进行模式匹配:

%struct_name{} = user
struct_name #=> User

当您想检查某物是否是结构但您对其名称不感兴趣时,您还可以将结构名称分配给_

%_{} = user

相关用法


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