这是我参与 11 月更文挑战的第 2 天,活动详情查看:2021 最后一次更文挑战
复合数据类型
复合数据类型,是由其它基本类型复合而成的数据类型。在 Rust 复合类型中,最常见的有数组、元组、结构体、枚举以及容器等等,容器另水一天
数组
数组,其大小固定,由同种数据类型组成。在 Rust 中,数组的创建方式大致分为三种
- 指定数组类型、数组大小,并赋予初始值
let arr: [i32; 3] = [1, 2, 3];
- 直接赋值,忽略数组类型
let arr = [1, 2, 3];
- 批量默认初始化元素,忽略数组类型
let arr = [32; 3];
对于数组内元素,通过 数组名 [索引] 的方式获取
元组
元组,其大小固定,由不同种数据类型组成。在 Rust 中,元组的创建方式如下
- 指定元组类型、元组大小,并赋予初始值
let tup: (i32, bool) = (12, true);
- 直接赋值,忽略元组类型
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);
}
复制代码




近期评论