rust struct
# struct
# 创建/使用语法
# 创建结构体
struct User<'a> {
name: &'a str,
age: i32,
email: &'a str
}
1
2
3
4
5
2
3
4
5
# 实例化结构体
let user = User {
name: "HGQ",
age: 21,
email: "huanggaoqing0119@gmail.com"
};
1
2
3
4
5
2
3
4
5
# 更新语法
# 更改某个字段
想要更改结构体字段的话,结构体必须是可以变的。
let mut user = User {
name: "HGQ",
age: 21,
email: "huanggaoqing0119@gmail.com"
};
1
2
3
4
5
2
3
4
5
user.email = "huanggaoqing0302@gmail.com";
1
# 根据某个结构体创建新的结构体
只有email字段改变了,其他字段都适用user结构体的
let user2 = User {
email: "huanggaoqing0302@gmail.com",
..user
};
1
2
3
4
2
3
4
# Tuple struct
# 创建/使用
struct Color (i32, i32, i32);
1
let color = Color(0, 0, 0);
1
# 🌰 小例子
# 求长方形的面积
- 第一种方式:
let w = 16;
let h = 6;
println!("area: {}", area(w, h))
fn area(w: i32, h: i32) -> i32 {
w * h
}
1
2
3
4
5
6
2
3
4
5
6
这种方式不好,原因是长方形的长宽应该存在联系的,现在这种方式,长和宽只是两个独立的变量,没有任何联系
- 第二种方式:
let rect = Rect {
width: 16,
height: 6
};
println!("area: {}", area(&rect))
fn area(r: &Rect) -> i32 {
r.width * r.height
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
使用结构体将长和宽封装到一起,就可以让他们产生联系,并成为一体。
# struct 方法
# 使用方法改进上面例子
在
impl块中定义方法impl块可以写多个方法第一个参数是 &self 执行的是实例本身,也可以获得实例本身的所有权(self)或可变引用(& mut self)
提示
获取可变引用时,实例本身也要是可变的,这样才可以修改实例本身的值
方法想要传递参数,直接在&self后面增加就可以
struct Rect {
width: i32,
height: i32
}
// 方法声明和定义
impl Rect {
// 无参数
fn area(&self) -> i32 {
self.width * self.height
}
// 有参数
fn can_hold(&self, other: &Rect) -> bool {
self.width >= other.width && self.height >= other.height
}
}
// 方法调用
println!("area: {}", rect.area())
// 有参数方法调用
let rect2 = Rect {
width: 10,
height: 3
};
println!("can: {}", rect.can_hold(&rect2))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
这样就可以把求长方形面积的方法和长方形的结构体关联起来,更加的合乎逻辑。
# struct关联函数(static)
提示
相当于是静态方法
// 创建
struct Rect {
width: i32,
height: i32
}
impl Rect {
fn new(width: i32, height: i32) -> Rect {
Rect {
width,
height
}
}
// 使用
let rect = Rect::new(16, 6);
let rect2 = Rect::new(10, 3);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
编辑 (opens new window)
上次更新: 2024/01/15, 02:08:26