结构体
struct 是一个自定义数据类型,允许包装和命名多个相关的值。从而形成一个有意义的组合。
结构体简写语法:变量名如果与结构体字段名相同,可以省略字段名。
// 结构体定义 #[derive(Debug)] struct User { active: bool, username: String, email: String, sign_in_count: u64, } fn main() { // 结构体实例创建 let mut user1 = User { active: true, username: String::from("Li Li"), email: String::from("lili@zhouyi.xin"), sign_in_count: 1, }; // 结构体字段修改 user1.email = String::from("li.li@zhouyi.xin"); // 结构体访问 println!("user1.active: {}", user1.active); println!("user1.username : {}", user1.username); println!("user1.email : {}", user1.email); println!("user1.sign_in_count : {}", user1.sign_in_count); let user2 = build_user(user1.email.clone(), user1.username.clone()); println!("user2.active: {}", user2.active); println!("user2.username : {}", user2.username); println!("user2.email : {}", user2.email); println!("user2.sign_in_count : {}", user2.sign_in_count); } fn build_user(email: String, username: String) -> User { // 也可以作为表达式返回结构体 User { active: true, username, // 由于参数名与字段名相同可以省略字段名。 email, sign_in_count: 1, } }
结构体更新语法
更新语法会转移结构体中的变量所有权
// 结构体定义 #[derive(Debug)] struct User { active: bool, username: String, email: String, sign_in_count: u64, } fn main() { let email = String::from("li.li@zhouyi@xin"); let username = String::from("li.li"); let user1 = build_user(email, username); let user2 = User { username: String::from("lili"), ..user1 }; println!("user2.active: {}", user2.active); println!("user2.username : {}", user2.username); println!("user2.email : {}", user2.email); println!("user2.sign_in_count : {}", user2.sign_in_count); } fn build_user(email: String, username: String) -> User { // 也可以作为表达式返回结构体 User { active: true, username, // 由于参数名与字段名相同可以省略字段名。 email, sign_in_count: 1, } }
没有命名字段的元组结构体
元组结构体有着结构体名称提供的含义,但没有具体的字段名称。当你想给整个元组取一个名字,并使元组成为与其他元组不同的类型时。
类单元结构体
没有任何字段的结构体,类似于 (),使用场景想在某个类型上实现 trait, 但不需要在类型中存储数据。
#[derive(Debug)] struct SayHello; trait Hello { fn hello(); } impl Hello for SayHello{ fn hello() { println!("hello"); } } fn main() { let subject = SayHello; println!("{:?}", subject); SayHello::hello(); }