元组和结构体
1. 元组
元组是多种类型组合在一起形成,是一种复合类型,英文用Tuple
表示,元组中的值称之为元素
。
语法为:(<value>, <value>, ...)
比如:
//boss名字,血量,是否掉落传说武器
let boss_info = ("boss名字",1000,true);
1
2
2
访问元组中的值,有两种办法:
使用索引访问
fn main() { let boss_info = ("boss名字",1000,true); println!("boss名字:{},boss血量:{},是否掉落传说武器:{}",boss_info.0,boss_info.1,boss_info.2); }
1
2
3
4
5模式匹配
fn main() { let boss_info = ("boss名字",1000,true); let (name,health,is_drop) = boss_info; println!("boss名字:{},boss血量:{},是否掉落传说武器:{}",name,health,is_drop); }
1
2
3
4
5
6
7
元组在接收多个返回值的时候会很有用,相较于只能有一个返回值的语言,会更加灵活和易用。
2. 结构体
结构体也是一个复合类型,使用struct
关键字来定义。
语法:
// field可以是任意类型
struct 结构体名称 {
field,
field,
...
}
1
2
3
4
5
6
2
3
4
5
6
相比较元组,结构体更加灵活和易用。
比如:
struct Boss{
name: String, //名字
health: u32, // 血量
base_hurt:u32, //基础伤害
drop_gold_rate:f32, //掉落金色装备概率
}
1
2
3
4
5
6
2
3
4
5
6
结构体的好处在于,访问字段的时候可以通过结构体名称.字段名称
来访问,不用在意顺序。
2.1 使用
fn main() {
struct Boss {
name: String, //名字
health: u32, // 血量
base_hurt: u32, //基础伤害
drop_gold_rate: f32, //掉落金色装备概率
}
//使用时需要创建该结构体的实例,并且需要指定各个字段的值
let boss = Boss {
name: String::from("大boss"),
health: 100,
base_hurt: 10,
drop_gold_rate: 0.01,
};
println!("名字:{}", boss.name)
}
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
如果我们想更新结构体中的某一个值如何做到呢?
fn main() {
struct Boss {
name: String, //名字
health: u32, // 血量
base_hurt: u32, //基础伤害
drop_gold_rate: f32, //掉落金色装备概率
}
//一定要加mut关键字才能修改其中的字段
let mut boss = Boss {
name: String::from("大boss"),
health: 100,
base_hurt: 10,
drop_gold_rate: 0.01,
};
boss.name = String::from("新名字");
println!("名字:{}", boss.name);
//也可以用这种方式,新实例化boss2,只定义name字段的值,其他值通过语法..从boss实例中自动获取
//..语法只能用在结构体尾部
let boss2 = Boss {
name: String::from("boss2名字"),
..boss
};
println!("boss2名字:{},boss2血量{}", boss2.name,boss2.health);
}
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
2.2 留个疑问
fn main() {
struct Boss {
name: String, //名字
health: u32, // 血量
base_hurt: u32, //基础伤害
drop_gold_rate: f32, //掉落金色装备概率
weapon: String, //武器
}
//一定要加mut关键字才能修改其中的字段
let mut boss = Boss {
name: String::from("大boss"),
health: 100,
base_hurt: 10,
drop_gold_rate: 0.01,
weapon: String::from("一把刀"), //新添加了一个String类型的字段
};
boss.name = String::from("新名字");
println!("名字:{}", boss.name);
//也可以用这种方式,新实例化boss2,只定义name字段的值,其他值通过语法..从boss实例中自动获取
let boss2 = Boss {
name: String::from("boss2名字"),
..boss
};
println!("boss2名字:{},boss2血量{}", boss2.name, boss2.health);
//注意 这行代码会报错
println!("这时候访问boss的weapon会发现不能使用:{}", boss.weapon);
}
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
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28