A struct, or structure, is a custom data type that lets you name and package together multiple related values that make up a meaningful group.
Defining and Instantiating Structs
相比元组,struct中的属性是无序的
To define a struct, we enter the keyword struct
and name the entire struct. A struct’s name should describe the significance of the pieces of data being grouped together. Then, inside curly brackets, we define the names and types of the pieces of data, which we call fields.
struct User { username: String, email: String, sign_in_count: u64, active: bool, }
let user1 = User { email: String::from("[email protected]"), username: String::from("someusername123"), active: true, sign_in_count: 1, };
如果其属性可能被修改,那么其实例必须声明为mut可变类型
let mut user1 = User { email: String::from("[email protected]"), username: String::from("someusername123"), active: true, sign_in_count: 1, }; user1.email = String::from("[email protected]");
Note that the entire instance must be mutable; Rust doesn’t allow us to mark only certain fields as mutable. As with any expression, we can construct a new instance of the struct as the last expression in the function body to implicitly return that new instance.
fn build_user(email: String, username: String) -> User { User { email: email, username: username, active: true, sign_in_count: 1, } }
we can use the field init shorthand syntax to rewrite build_user
so that it behaves exactly the same but doesn’t have the repetition of email
and username
fn build_user(email: String, username: String) -> User { User { email, username, active: true, sign_in_count: 1, } }
Creating Instances From Other Instances With Struct Update Syntax
It’s often useful to create a new instance of a struct that uses most of an old instance’s values but changes some. You’ll do this using struct update syntax.
let user2 = User { email: String::from("[email protected]"), username: String::from("anotherusername567"), active: user1.active, sign_in_count: user1.sign_in_count, };
The syntax ..
specifies that the remaining fields not explicitly set should have the same value as the fields in the given instance.
let user2 = User { email: String::from("[email protected]"), username: String::from("anotherusername567"), ..user1 };