结构

结构体 属于 Elixir

21 个练习

关于 结构体

结构体是一种特殊的映射,它的键是预先定义好的一组。

  • 结构体提供编译期检查和默认值。
  • 结构体的名字取自定义它的模块。
  • 定义结构体要使用defstruct构造。
    • 这个构造通常紧跟在模块定义之后。
  • defstruct接受原子列表(用于 nil 默认值)或关键字列表(用于指定的默认值)。
    • 没有默认值的字段必须排在带默认值的字段前面。
defmodule Plane do
  defstruct [:engine, wings: 2]
end

plane = %Plane{}
# => %Plane{engine: nil, wings: 2}

访问字段与更新

  • 大多数能处理映射的函数也能处理结构体。

  • 访问结构体字段时,建议使用_静态访问运算符_ .。

  • 获取/读取字段的值:

    plane = %Plane{}
    plane.engine
    # => nil
    Map.fetch(plane, :wings)
    # => {:ok, 2}
    
  • 更新字段的值

    plane = %Plane{}
    %{plane | wings: 4}
    # => %Plane{engine: nil, wings: 4}
    

强制字段值初始化

  • @enforce_keys 模块属性会在创建结构体时进行运行期检查,要求指定字段必须被初始化为非nil的值。
  • @enforce_keys后面是一个字段键的列表(这些键是原子)。
  • 如果被强制的键没有初始化,就会报错。
defmodule User do
  @enforce_keys [:username]
  defstruct [:username]
end

%User{}
# => (ArgumentError) the following keys must also be given when building struct User: [:username]
通过 GitHub 编辑 该链接会在新窗口或标签页中打开

学习 结构体

练习已锁定

再解锁 9 个练习即可练习 结构体