复合数据类型复合数据类型

这是我参与 11 月更文挑战的第 2 天,活动详情查看:2021 最后一次更文挑战

复合数据类型

复合数据类型,是由其它基本类型复合而成的数据类型。在 Rust 复合类型中,最常见的有数组、元组、结构体、枚举以及容器等等,容器另水一天

数组

数组,其大小固定,由同种数据类型组成。在 Rust 中,数组的创建方式大致分为三种

  1. 指定数组类型、数组大小,并赋予初始值
    • let arr: [i32; 3] = [1, 2, 3];
  2. 直接赋值,忽略数组类型
    • let arr = [1, 2, 3];
  3. 批量默认初始化元素,忽略数组类型
    • let arr = [32; 3];

对于数组内元素,通过 数组名 [索引] 的方式获取

元组

元组,其大小固定,由不同种数据类型组成。在 Rust 中,元组的创建方式如下

  1. 指定元组类型、元组大小,并赋予初始值
    • let tup: (i32, bool) = (12, true);
  2. 直接赋值,忽略元组类型
    • let tup = (12, true);

对于元组内元素,存在两种获取方式,分别为解构获取、索引获取,如下

#[test]
fn test() {
    let tup1 = (12, true);
    let tup2 = (12, true);
    // 解构获取
    let (a, b) = tup1;
    // 索引获取
    let c = tup2.0;
    println!("{} {}", a, b);
    println!("{}", c);
}
复制代码

结构体

结构体是以 struct 关键字声明的,由多个键值字段组成的复合数据类型,前者是字段名,后者是字段类型,如下

#[derive(Debug)]
struct Student {
    name: String,
    age: i32,
}

#[test]
fn test() {
    let s1 = Student {
        name: String::from("李明"),
        age: 12,
    };
    println!("{:#?}", s1);
}
复制代码

对于结构体,存在很多的细节,例如字段值的继承、字段无序、忽略字段名等,如下

#[derive(Debug)]
struct Student {
    name: String,
    age: i32,
}

#[test]
fn test() {
    let s1 = Student {
        name: String::from("李明"),
        age: 12,
    };
    let s2 = Student {
        age: 24,
        ..s1
    };
    println!("{:#?}", s2);
}
复制代码

当然,这种语法糖,个人强烈不推荐使用,了解即可,可以查阅 Rust 提供的官方文档

枚举

Rust 中,通过 enum 关键字定义枚举类型,而枚举值可以通过 枚举名:: 枚举值 的方式获取。枚举一般用于定义有限的集合,例如世界语言的种类,如下

#[derive(Debug)]
enum Student {
    Zhangsan,
    Lisi,
}

#[test]
fn test() {
    let s1 = Student::Lisi;
    match s1 {
        Student::Zhangsan => {
            println!("{:#?}", Student::Zhangsan)
        }
        Student::Lisi => {
            println!("{:#?}", Student::Lisi);
        }
    }
}
复制代码

根据枚举值是否存在数据类型,划分为无参枚举、有参枚举,如下

#[derive(Debug)]
enum Student {
    Zhangsan(String),
    Lisi(String),
}

#[test]
fn test() {
    let s1 = Student::Lisi(String::from("张三"));
    println!("{:#?}", s1);
}
复制代码