MagicalBridge/Blog

Rust入门系列:07、Rust中的数据类型之:复合类型

Opened this issue · 0 comments

基本定义

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.0tup.1tup.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 变量声明了一个数组,包含五个元素:整数 12345
  • 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.nameperson.ageperson.height 分别访问结构体的 nameageheight 字段。

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 枚举定义了三个变体:RedGreenBlue
  • 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(); 语句创建一个名为 scoresHashMap 实例,其中键类型为 String,值类型为 u32mut 关键字表示该变量是可变的,可以对其内容进行修改。

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 中的每个键值对。 &scoresHashMap 转换为引用,以便在循环中使用。
  • keyvalue 变量分别表示当前键和值。

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 是否包含指定的键。