Rust 中的复合类型(Compound Types)用于将多个值组合在一起,是理解和使用 Rust 语言的基础。本文将详细介绍三种主要的复合类型:元组(Tuple)、数组(Array)和切片(Slice),并通过示例帮助你掌握它们的常见用法与差异。


一、元组(Tuple)

元组是可以包含多个不同类型的值的集合,适用于表示结构化但异构的数据。

示例:

fn main() {
    let person: (u32, f64, char) = (30, 1.75, '男');

    // 通过索引访问元素
    println!("年龄: {}", person.0);
    println!("身高: {}", person.1);
    println!("性别: {}", person.2);

    // 解构元组
    let (age, height, gender) = person;
    println!("解构后: {} {} {}", age, height, gender);
}

特殊的空元组:()

空元组称为 unit 类型,常见于没有返回值的函数中:

fn say_hello() {
    println!("Hello");
    // 实际返回值是 ()
}

二、数组(Array)

数组是长度固定、元素类型一致的数据集合,适用于处理已知数量的元素。

示例:

fn main() {
    let scores: [i32; 5] = [90, 85, 70, 100, 95];

    // 使用索引访问
    println!("第一个分数: {}", scores[0]);

    // 遍历数组
    for score in scores.iter() {
        println!("得分: {}", score);
    }

    // 初始化多个相同元素
    let zeros = [0; 10]; // 创建包含 10 个 0 的数组
}

注意事项:

  • 索引越界将触发 panic。

  • 数组的长度是类型的一部分,因此 [i32; 3] 与 [i32; 4] 是不同的类型。


三、切片(Slice)

切片是数组或字符串的一部分视图,长度可变,但不拥有数据的所有权。

示例:数组切片

fn main() {
    let arr = [10, 20, 30, 40, 50];

    let slice: &[i32] = &arr[1..4];
    println!("切片内容: {:?}", slice);

    for item in slice {
        println!("元素: {}", item);
    }
}

示例:字符串切片

fn main() {
    let s = String::from("hello rust");

    let hello = &s[0..5]; // "hello"
    let rust = &s[6..];   // "rust"

    println!("{} - {}", hello, rust);
}

特点:

  • 切片不会拥有数据,而是引用原始数据的一部分。

  • 适用于函数参数中:

fn print_slice(slice: &[i32]) {
    for item in slice {
        println!("{}", item);
    }
}

四、类型对比小结

类型

可变性

长度

类型一致性

适用场景

Tuple

固定

可异构

小型、结构化异构数据组

Array

固定

元素一致

静态数组、小批量数据

Slice

动态

元素一致

引用数组/字符串的局部段落


总结

Rust 的复合类型为数据组织提供了灵活且安全的结构。从固定长度的数组,到灵活切片,再到可以混合不同类型的元组,掌握这些类型将帮助你更高效地处理数据结构。根据实际需求选择合适的类型,是写好 Rust 程序的重要基础。


本站由 困困鱼 使用 Stellar 创建。