08-定义并实例化结构体
2022/4/29 23:18:49
本文主要是介绍08-定义并实例化结构体,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
定义并实例化结构体(struct)
定义结构体
-
使用
struct
关键字给整个结构体命名 -
在大括号中定义每一部分的名字和类型,即字段(field)
struct User { active: bool, username: String, email: String, sign_in_count: u64, //逗号,最后一部分结尾也要加逗号 }
注意:大括号内每一部分定义后要加逗号,最后一部分字段也要加逗号
实例化结构体
要想在定义结构体后使用结构体,就要为每个字段创建具体值来创建结构体的实例
-
创建实例以结构体名字开头
-
在大括号中使用
key:value
即字段名字:要储存在字段中的数据值- 为每个字段指定具体值
- 无需按声明的顺序指定
- 但是创建实例时,字段要和定义时一一对应,即定义时有几个字段,实例中就要有几个
let user1 = User { email: String::from("someone@example.com"), username: String::from("someusername123"), active: true, sign_in_count: 1, //顺序是可以打乱的 };
取得结构体中的值
-
点标记法(句号),使用句号为可变的结构体实例中对应的字段赋值
-
整个实例必须是可变的;Rust不允许单独声明某一个字段为可变
let mut user1 = User { //user为可变的结构体,那么其中的字段也都为可变 email: String::from("someone@example.com"), username: String::from("someusername123"), active: true, sign_in_count: 1, }; user1.email = String::from("anotheremail@example.com");
结构体可作为函数的返回值
-
可以在函数体的最后一个表达式中构造一个结构体的新实例,来隐式地返回这个实例
fn build_user(email: String, username: String) -> User { User { email: email, username: username, active: true, sign_in_count: 1, } //该函数返回一个 email 和 username 的 User 结构体实例 } //在主函数中通过该函数给与 email 与 username 值并返回整个结构体
字段初始化简写(field init shorthand)
-
当字段名与字段值对应变量名相同时,可以使用字段初始化简写
fn build_user(email: String, username: String) -> User { User { email, //因为email字段与email参数有相同的名称 username, //同上 active: true, sign_in_count: 1, }
结构体更新语法(struct update syntax)
-
通过一个结构体实例创建一个新实例,其中新实例中大部分值与旧实例的值相同,其他一部分值与旧实例不同
let user1 = User { email: String::from("someone@example.com"), username: String::from("someusername123"), active: true, sign_in_count: 1, }; /*这个为不使用更新语法l创建新实例 //声明字段使顺序可以改变 let user2 = User { active: user1.active, username: user1.username, email: String::from("another@example.com"), //只有这个值是新的;其余三个值都来自旧实例 sign_in_count: user1.sign_in_count, }; */ //更新语法 let user2 = User { email: String::from("another@example.com"), ..user1 };
元组结构体(tuple struct)
元组结构体有着结构体名称提供的含义,但没有具体的字段名,只有字段的类型
-
整体有名字,里面的元素没有名字
-
想给整个元组取一个名字,并使元组成为与其他元组不同的类型时
-
定义时:以
struct
关键字和结构体名开头并后跟元组中的类型struct Color(i32, i32, i32); //整体叫做 Color 但元素只有类型没有名字 struct Point(i32, i32, i32); fn main() { let black = Color(0, 0, 0); let origin = Point(0, 0, 0); }
需要注意的是,
black
和origin
值的类型不同,是不同元组结构体的实例;自己定义的每一个结构体都有自己的类型,即使结构体中的字段有着相同的类型 -
元组结构体类似元组:可以将其解构为单独的部分,也可以使用
.
后跟索引来访问单独的值
类单元结构体(unit-like structs)
即一个没有任何字段的结构体
-
类似单元类型(即没有值的元组类型)
-
适用:想要在某个类型上实现 trait 但不需要在类型中存储数据的时候发挥作用
-
定义时:
struct
关键字后跟名字,不加花括号或圆括号,然后加分号struct AlwaysEqual; fn main() { let subject = AlwaysEqual; }
结构体数据的所有权
-
例子
struct User { active: bool, username: String, //这里字段使用的是String,而不是&str email: String, sign_in_count: u64, }
-
这里的字段使用的是String,而不是&str
- 该结构体实例有其所有的数据
- 只要该结构体实例时有效的,那么里面的字段数据也时有效的
-
结构体实例中也可以有引用(
&str
)- 但需要生命周期(lifetime)
- 生命周期确保结构体引用的数据有效性跟结构体本身保持一致
- 如果在结构体中存储一个引用而不指定生命周期将是无效的
struct User { active: bool, username: &str, //这里字段使用的是引用 email: &str, sign_in_count: u64, }
该代码不能正常编译
这篇关于08-定义并实例化结构体的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)
- 2024-05-30【Java】百万数据excel导出功能如何实现