当前位置: 首页 > 文档资料 > Elixir 中文教程 >

Structs( Structs)

优质
小牛编辑
136浏览
2023-12-01

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

定义结构

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

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

与defstruct一起使用的关键字列表定义了struct将包含哪些字段及其默认值。 结构取其定义的模块的名称。在上面给出的示例中,我们定义了一个名为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"}

Structs提供编译时保证,只允许通过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

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

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

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

最后更新:

类似资料

  • 我正在使用spark 2.3,我有一个具有以下模式的数据框架 如果您注意到自定义属性。自定义属性是数组(struct) 现在,我将属性ID设置为“x”。我需要检查属性ID“x”是否存在于数组中的任何结构中,并获取值输出。 我有一个属性ID和列名的列表 假设-如果属性ID为“x”,则获取其值并填充到x列中 下面是属性ID到列的映射x- 如果结构中没有可用的属性,那么只需在该列中设置为null

  • 有3个堆栈-A、B、C 堆栈A和B被排序(堆栈顶部的数字最大)。堆栈C为空,仅允许5次操作: 推,弹出,顶,is_empty,创建 我们需要编写一个函数来接收堆栈A和B,将堆栈A和B中的所有数字移动到堆栈C,堆栈C必须排序(最大数字在顶部)。 我有算法: 比较A的顶部和B的顶部 弹出最小的元素并推送到堆栈C 重复步骤2,直到任何堆栈(A或B)变空 将剩余元素从非空堆栈移动到C。现在你有了C中的所有

  • 有3个堆栈-A、B、C 堆栈A和B被排序(堆栈顶部的数字最大)。堆栈C为空,仅允许5次操作: 推,弹出,顶,is_empty,创建 我们需要编写一个函数来接收堆栈A和B,将堆栈A和B中的所有数字移动到堆栈C,堆栈C必须排序(最大数字在顶部)。 我有算法: 比较A的顶部和B的顶部 我开始写代码,但有错误,我不知道为什么! 代码:

  • 该structure是D编程中另一种用户定义的数据类型,它允许您组合不同类型的数据项。 结构用于表示记录。 假设您想要在图书馆中跟踪您的图书。 您可能希望跟踪每本书的以下属性 - Title Author Subject Book ID 定义一个结构 (Defining a Structure) 要定义结构,必须使用struct语句。 struct语句定义一个新的数据类型,为您的程序提供多个成员。

相关阅读

开发工具

Structs