1.什么是struct
struct是结构体
- 自定义的数据类型
- 为相关联的值命名,打包,然后组成一组有意义的组合
2.定义struct
使用struct关键字,并为整个struct命名 在花括号内,为所有字段(Field)定义名称和类型
struct User {
username:String,
email:String,
sign_in_count:u64,
active:bool,
}
3.实例化struct
想要使用struct,需要创建struct的实例
- 为每个字段指定具体值
- 无需按声明的顺序进行指定
struct User {
username: String,
email:String,
sign_in_count:u64,
active:bool,
}
fn main() {
let user1 = User {
email: String::from("hdat.top"),
username: String::from("hdat"),
active: true,
sign_in_count: 600,
};
println!("{}",user1.email); // hdat.top
}
更改struct里面的某个值
首先要让他是可变的
struct User {
username: String,
email:String,
sign_in_count:u64,
active:bool,
}
fn main() {
let mut user1 = User {
email: String::from("hdat.top"),
username: String::from("hdat"),
active: true,
sign_in_count: 600,
};
user1.email = String::from("hdat@163.com");
println!("{}",user1.email); // hdat@163.com
}
一旦这个struct的实例是可变的,那么这个实例中所有的字段都是可变的
4.struct 作为函数的返回值
struct User {
username: String,
email:String,
sign_in_count:u64,
active:bool,
}
fn return_user(email:String,username:String) -> User {
User {
email: email,
username :username,
active: true,
sign_in_count: 300,
}
}
fn main() {
let my_user = return_user(String::from("hdat@gmail.com"),String::from("hdata"));
println!("{}",my_user.email); // hdat@gmail.com
}
5.字段初始化简写
当字段名和字段值对应变量名相同时,就可以使用字段初始化简写的方式
// 字段初始化时简写
fn build_user(email:String,username:String) -> User {
User {
username,
email,
active: true,
sign_in_count: 121,
}
}
6.struct更新语法
如果需要基于某个现有struct实例来创建一个新实例的时候,可以使用struct的更新语法
// 更新语法
// let user2 = User {
// email: String::from("new_hdat.top"),
// username: String::from("new_hdat"),
// active: true,
// sign_in_count: 600,
// };
let user2 = User {
email: String::from("new_hdat.top"),
username: String::from("new_hdat"),
..user1
};
println!("{}",user2.active);
更新user1来获得user2
7.Tuple struct
可以定义类似tuple的struct,叫做tuple struct
适用于:给tuple整体起名,但是不用给每个元素起名,并让他不同于其他tuple
定义tuple struct
// tuple struct
struct Color(i32,i32,i32);
struct Point(i32,i32,i32);
let black = Color(0,0,0);
let origin = Point(2,2,2);
// black 和 origin 是不同的类型,因为他们是不同 tuple struct 的实例
8.Unit-Like Struct (没有任何字段)
可以定义没有任何字段的struct, 叫Unit-Like struct
这个用于需要在某个类型上实现某个trait,但是在里面又没有想要存储的数据。
9.struct数据的所有权
struct User {
username: String,
email:String,
sign_in_count:u64,
active:bool,
}
这个结构体定义的时候,字段使用了String而不是&str
那么这样该struct实例拥有其所有的数据的所有权,只要struct实例是有效的,那么里面的字段数据也是有效的。
struct里面也可以存放引用,但是需要使用生命周期。生命周期保证struct实例是有效的,那么里面的引用也是有效的。