Rust 入门 结构体
结构体
认识结构体
- 结构体(struct) 是一个自定义数据类型
- 允许你命名和包装多个相关的值, 形成一个有意义的组合
定义结构体
- 使用
struct
关键字定义一个结构体 - 结构体的成员叫做字段(field)
例子
struct User {
username: String,
password: String,
email: String,
age: u32,
}
实例化结构体
- 必须为每个字段指定具体的值
- 无需按照字段声明的顺序进行指定
例子
let user = User {
username: String::from("admin"),
password: String::from("Admin&rust"),
email: String::from("admin@qq.com"),
age: 18,
};
访问结构体字段
- 使用点标记法获取字段
- 如果需要改变结构体内的值, 我们需要将结构体声明为可变的
例子
let mut user = User {
username: String::from("admin"),
password: String::from("Admin&rust"),
email: String::from("admin@qq.com"),
age: 18,
};
user.email = String::from("admin@139.com");
简写语法
- 变量与字段同名时: 可以省略字段名
fn build_user(username: &str, password: &str, email: &str, age: u32) -> User {
User {
username: String::from(username),
password: String::from(password),
email: String::from(email),
age,
}
}
- 从其他实例创建实例
let user = build_user("admin", "Admin&rust", "admin@qq.com", 18);
// 结构体更新语法
let user2 = User {
username: String::from("admin2"),
password: String::from("admin2&rust"),
..user
};
元组结构体
- 类似于元组的结构体就叫做元组结构体(tuple struct)
- 元组结构体拥有名字, 字段(元素)没有名字
例子
struct Color(u8, u8, u8, u8);
fn main() {
let red = Color(255, 255, 0, 0);
}
类单元结构体
- 没有任何字段的控结构体叫做类单元结构体(unit-like structs)
- 类单元结构体适用于在某个类型上实现某个trait 但是没有想要储存的数据
例子
struct Unit{}
fn main() {
let u = Unit{};
}
结构体方法(重点)
- 方法和函数几乎完全一样, 这里仅说明不同之处:
- 方法是在结构体(menu/trait) 对象的上下文中定义的
- 方法的第一个参数为
self
,self表示当前的struct实例
- 定义方法需要在结构体的实现块(implementation chunk) 中
- 方法签名中使用
&self
或者self
来替代结构体实例
例子
struct Person {
name: String,
age: u8,
}
impl Person {
fn laugh(&self) {
println!("{} 发出了笑声", self.name);
}
}
fn main() {
let person = Person { name: String::from("Tom"), age: 18 };
person.laugh();
}
结构体关联函数
- 在实现块中定义的函数叫做关联函数
- 关联函数通常用于构造器
- 关联函数使用
::
进行访问
例子
struct Person {
name: String,
age: u8,
}
impl Person {
fn laugh(&self) {
println!("{} 发出了笑声", self.name);
}
fn new(name: &str, age: u8) -> Person {
Person { name: String::from(name), age }
}
}
fn main() {
let person = Person::new("Tom", 18);
person.laugh();
}
结构体使用实例
// demo 2
struct Rect {
width: u32,
length: u32,
}
impl Rect {
fn new(width: u32, length: u32) -> Rect {
Rect { width, length }
}
fn area(&self) -> u32 {
self.width * self.length
}
}
fn main() {
// demo 1
let w = 30;
let l = 50;
let s = area(w, l);
println!("长方形的面积: {}", s);
// demo 2
let rect = Rect::new(30, 50);
println!("长方形的面积: {}", rect.area());
}
// demo 1
fn area(width: u32, length: u32) -> u32 {
width * length
}
虽然运行结果相同, 但是使用结构体封装的形式更符合模块化标准
如果对我分享的内容感兴趣的话 记得关注我得动态
求推荐 求收藏 求转发 求关注
求推荐 求收藏 求转发 求关注