Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
MagicalBridge opened this issue Jun 24, 2024 · 0 comments
Open

Comments

@MagicalBridge
Copy link
Owner

基本定义

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 是否包含指定的键。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant