📜  Elixir-结构

📅  最后修改于: 2020-11-04 08:28:21             🧑  作者: Mango


 

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

定义结构

为了定义一个结构,使用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"}

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