Elixir - 结构体



结构体是在映射的基础上构建的扩展,提供了编译时检查和默认值。

定义结构体

要定义结构体,使用 defstruct 结构体 -

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

与 defstruct 一起使用的关键字列表定义了结构体将具有的字段以及它们的默认值。结构体采用定义它们的模块的名称。在上面给出的示例中,我们定义了一个名为 User 的结构体。我们现在可以使用类似于创建映射的语法来创建 User 结构体 -

new_john = %User{})
ayush = %User{name: "Ayush", age: 20}
megan = %User{name: "Megan"})

以上代码将生成三个具有以下值的不同的结构体 -

%User{age: 27, name: "John"}
%User{age: 20, name: "Ayush"}
%User{age: 27, name: "Megan"}

结构体提供编译时保证,只有通过 defstruct 定义的字段(以及所有字段)才允许存在于结构体中。因此,一旦在模块中创建了结构体,就不能定义自己的字段。

访问和更新结构体

当我们讨论映射时,我们展示了如何访问和更新映射的字段。相同的技术(以及相同的语法)也适用于结构体。例如,如果我们想更新我们在前面示例中创建的用户,那么 -

defmodule User do
   defstruct name: "John", age: 27
end
john = %User{}
#john right now is: %User{age: 27, name: "John"}

#To access name and age of John, 
IO.puts(john.name)
IO.puts(john.age)

当运行上述程序时,它会产生以下结果 -

John
27

要更新结构体中的值,我们将再次使用在映射章节中使用的相同过程,

meg = %{john | name: "Meg"}

结构体也可以用于模式匹配,既可以匹配特定键的值,也可以确保匹配值与匹配值类型相同的结构体。

广告