元组和结构体

1. 元组

元组是多种类型组合在一起形成,是一种复合类型,英文用Tuple表示,元组中的值称之为元素

语法为:(<value>, <value>, ...)

比如:

//boss名字,血量,是否掉落传说武器
let boss_info = ("boss名字",1000,true)
1
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

相比较元组,结构体更加灵活和易用。

比如:

struct Boss{
        name: String, //名字
        health: u32, // 血量
        base_hurt:u32, //基础伤害
        drop_gold_rate:f32, //掉落金色装备概率
    }
1
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

如果我们想更新结构体中的某一个值如何做到呢?

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.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