Rust基础05-初见结构体
初识struct
-
何为struct:
struct,即为结构体,是一种允许自定义的数据类型
其允许为一组相关联的值命名并打包为有意义的组合
-
定义struct:
使用 struct 关键字,并为整个 struct 命名
在花括号中,为所有字段(Field)定义名称和类型
struct User { username:String. email:String, sign_in_count:u64, active:bool, };
-
实例化struct:
想要使用 struct,需要创建 struct 的实例:
- 为每个字段指定具体值
- 无需按声明的顺序进行指定
struct User { username:String. email:String, sign_in_count:u64, active:bool, }; let user1 = User { email:String::from("someone@example.com"), username:String::from("someusername123"), active:true, sign_in_count:1, };
-
取得 struct 中的某个值:
使用点标记法:
struct User { username:String. email:String, sign_in_count:u64, active:bool, }; let mut user1 = User { email:String::from("someone@example.com"), username:String::from("someusername123"), active:true, sign_in_count:1, }; user1.email = String::from("anotheremail@example.com")
注意:一旦 struct 实例可变,那么实例中-所有的字段均可变
-
struct 作为函数的返回值:
fn build_user(email:String, username:String) -> User { User { email:email, username:username, active:true, sign_in_count:1, } }
字段初始化简写:当字段名与字段值对应变量名相同时,就可使用字段初始化简写的方式
fn build_user(email:String, username:String) -> User { User { email,//已简写 username,//已简写 active:true, sign_in_count:1, } }
-
struct 更新语法:
当想基于某个 struct 实例来创建一个新实例时,可以使用 struct 更新语法
见下例 main函数 user2 中使用了更新语法
struct User { username: String, email: String, sign_in_count: u64, active: bool, } fn main() { let user1 = User { email: String::from("one@example.com"), username: String::from("username555"), sign_in_count:1, active:true, }; let user2 = User { email: String::from("another@example.com"), username: String::from("anotherusername567"), ..user1 }; }
-
Tuple struct:
可定义类似 tuple 的 struct,叫做 tuple struct
- Tuple struct 整体有名,内部元素无名
- 适用于想给整个 Tuple 起名,并让它不同于其他 tuple,而且不需要给每个元素起名
定义 tuple struct:
使用 struct 关键字,后面为名字,以及内部元素的类型
struct Color(i32, i32, i32); struct Point(i32, i32, i32); let black = Color(0, 0, 0); let origin = Point(0, 0, 0);
其中 black 和 origin 是不同的类型,是不同 tuple struct 的实例
-
Unit-Like Struct (无任何字段)
可以定义没有任何字段的 struct,叫做 Unit-Like struct (因为与(),单元类型类似)
适用于需要在某个类型上实现某个 trait,但是在里面又没有想要存储的数据
-
struct 数据的所有权:
struct User { username: String, email: String, sign_in_count:u64, active:bool, }
这里的字段使用了 String 而不是 &str:
- 该 struct 实例拥有其所有的数据
- 只要 struct 实例是有效的,那么里面的字段数据也是有效的
struct 里也可以存放引用,但这需要使用生命周期