Rust入门系列:07、Rust中的数据类型之:复合类型Rust 编程语言提供了多种复合数据类型,用于存储和组织复杂数据
基本定义
Rust 编程语言提供了多种复合数据类型,用于存储和组织复杂数据。
1. 元组 (Tuple)
元组是一种用于存储固定数量值的有序集合。 元组中的元素可以是不同类型的,并且元组的长度是固定的,一旦声明就不能改变。
示例:
let tup = (1, 2.3, "hello");
println!("The first element of the tuple is: {}", tup.0);
println!("The second element of the tuple is: {}", tup.1);
println!("The third element of the tuple is: {}", tup.2);
解释:
tup
变量声明了一个元组,包含三个元素:一个整数1
、一个浮点数2.3
和一个字符串"hello"
。tup.0
、tup.1
和tup.2
分别访问元组的第一个、第二个和第三个元素。
2. 数组 (Array)
数组是一种用于存储相同类型固定数量值的集合。 数组中的元素必须是相同类型的,并且数组的长度也是固定的,一旦声明就不能改变。
示例:
let arr = [1, 2, 3, 4, 5];
for i in 0..arr.len() {
println!("The {}th element of the array is: {}", i + 1, arr[i]);
}
解释:
arr
变量声明了一个数组,包含五个元素:整数1
、2
、3
、4
和5
。arr.len()
方法返回数组的长度。- 循环迭代数组中的每个元素,并打印其值。
3. 结构体 (Struct)
结构体是一种用于存储一组具有相关关系的数据的复合类型。 结构体由字段(field)组成,每个字段都有自己的名称和类型。 结构体可以用 struct
关键字来声明。
示例:
struct Person {
name: String,
age: u32,
height: f64,
}
let person = Person {
name: "John Doe".to_string(),
age: 30,
height: 1.75,
};
println!("The person's name is: {}", person.name);
println!("The person's age is: {}", person.age);
println!("The person's height is: {}", person.height);
解释:
Person
结构体定义了三个字段:name
(字符串类型)、age
(无符号 32 位整数类型)和height
(浮点数类型)。person
变量创建了一个Person
结构体的实例。person.name
、person.age
和person.height
分别访问结构体的name
、age
和height
字段。
4. 枚举 (Enum)
枚举是一种用于定义一组常量的复合类型。 枚举的每个常量称为变体(variant)。 枚举可以用 enum
关键字来声明。
示例:
enum Color {
Red,
Green,
Blue,
}
let color = Color::Red;
match color {
Color::Red => println!("The color is red"),
Color::Green => println!("The color is green"),
Color::Blue => println!("The color is blue"),
}
解释:
Color
枚举定义了三个变体:Red
、Green
和Blue
。color
变量声明了一个Color
枚举的实例,并将其值设置为Red
。match
表达式用于根据color
的值执行不同的代码块。
5. Vec
Vec 是一种动态数组类型,用于存储相同类型的值。 Vec 的元素数量可以在运行时动态增长或缩减,因此它是一种动态数据结构。
示例:
let mut vec = Vec<i32>::new();
vec.push(1);
vec.push(2);
vec.push(3);
for element in &vec {
println!("The element is: {}", element);
}
解释:
vec
变量声明了一个新的Vec
实例。vec.push()
方法将元素添加到Vec
的末尾
6.HashMap
HashMap 是一种用于存储键值对的哈希表数据结构。它由键的集合和值的集合组成,每个键都与一个值相关联。HashMap 的键可以是任何哈希可用的类型,而值可以是任何类型。
HashMap 与其他复合类型(如元组、数组、结构体和枚举)的区别在于,HashMap 的键值对是无序的,并且键是唯一的。此外,HashMap 的键可以是哈希可用的任何类型。
示例:
1. 创建一个 HashMap
use std::collections::HashMap;
let mut scores: HashMap<String, u32> = HashMap::new();
解释:
use std::collections::HashMap;
语句将HashMap
模块引入作用域。let mut scores: HashMap<String, u32> = HashMap::new();
语句创建一个名为scores
的HashMap
实例,其中键类型为String
,值类型为u32
。mut
关键字表示该变量是可变的,可以对其内容进行修改。
2. 向 HashMap 中插入键值对
scores.insert("Alice".to_string(), 95);
scores.insert("Bob".to_string(), 80);
scores.insert("Charlie".to_string(), 72);
解释:
-
scores.insert()
方法将键值对插入到HashMap
中。 第一个参数是键,第二个参数是值。 在此示例中,我们插入了三个键值对:"Alice": 95
表示 Alice 的分数为 95"Bob": 80
表示 Bob 的分数为 80"Charlie": 72
表示 Charlie 的分数为 72
3. 访问 HashMap 中的值
let alice_score = scores.get("Alice").unwrap();
println!("Alice's score is: {}", alice_score);
let bob_score = scores.get("Bob").unwrap();
println!("Bob's score is: {}", bob_score);
解释:
scores.get()
方法用于获取指定键的值。 如果键不存在,则返回None
。 在此示例中,我们获取了 Alice 和 Bob 的分数。unwrap()
方法用于从Option
类型中提取值。 如果值存在,则返回该值;否则,引发错误。
4. 遍历 HashMap
for (key, value) in &scores {
println!("Key: {}, Value: {}", key, value);
}
解释:
for
循环用于遍历HashMap
中的每个键值对。&scores
将HashMap
转换为引用,以便在循环中使用。key
和value
变量分别表示当前键和值。
5. 从 HashMap 中删除键值对
scores.remove("Charlie");
if scores.contains_key("Charlie") {
println!("Charlie is still in the scores HashMap");
} else {
println!("Charlie has been removed from the scores HashMap");
}
解释:
scores.remove()
方法用于从HashMap
中删除指定键的键值对。 如果键不存在,则返回None
。scores.contains_key()
方法用于检查HashMap
是否包含指定的键。
转载自:https://juejin.cn/post/7383548892626944015