使用结构体组织相关的数据
定义并实例化结构体
struct User {
username: String,
email: String,
sign_in_count: u64,
active: bool,
}
fn main() {
let mut user1 = User {
usernaem: String::from("someusername"),
emain: String::from("someone@example.com"),
active: true,
sign_in_count: 1,
};
user1.email = String::from("one&example.com");
}
定义结构体需要使用struct
关键字并为整个结构体提供一个名字。接着在大括号中,定义每一部分数据的名字和类型,我们成为字段。
创建结构体实例,通过为每个字段指定具体值来创建这个结构体的 实例。
我们可以在函数的最后一个表达是中构造一个结构体的新实例,来隐式地返回这个实例。
fn build_user(email: String, username: String) -> User {
User {
email: email,
username: username,
active: true,
sign_in_count: 1,
}
}
为函数参数起与结构体自相同的名字是可以理解的,但是不得不重复email
和username
字段名与变量名有些啰嗦。
fn build_user(emain: String, username: String) -> User {
User{
email,
username,
active: true,
sign_in_count: 1,
}
}
使用结构体更新语法重其他实例创建实例
let user1 = User {
email: String::from("some@example.com"),
username: String::from("zhang"),
active: true,
sign_in_count: 1,
};
let user2 = User {
email: String::from("abc@example.com"),
username: String:from("li"),
active: user1.active,
sign_in_count: user1.sign_in_count,
};
使用结构体更新语法,我们可以通过更少的代码来达到相同的效果。
let user2 = User {
emain: String:from("abc@example.com"),
username: String::from("li"),
..user1
};
使用没有名字字段的元组结构体来创建不同的类型
也可以定义与元组类似的结构体,称为元组结构体。
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);
let black = Color(0, 0, 0);
let origin = Point(0, 0, 0);
没有任何字段的类单元结构体
我们也可以定义一个没有任何字段的结构体!它们被称为单元结构体因为他们类似于()
,即unit
类型。
使用结构体的示例程序
#[derive(Debug)]
struct Rectangle {
width: u32,
height: u32,
}
fn main() {
let rect1 = Rectangle {width: 12, height: 24};
println!("{}", area(&rect1));
}
fn area(rec: &Rectangle) {
rectangle.width * rectangle.height
}
网友评论