数组

18 阅读2分钟
  • 数组概述

    • 数组是长度固定、元素类型相同的数据结构。
    • Rust 中的数组是存储在栈上,性能优秀,但长度必须在编译时确定。

    创建数组

    • 定义数组使用方括号 [] 并初始化元素。

    数组定义示例

    fn main() {
        let a = [1, 2, 3, 4, 5];
    }
    
    • 可以声明数组类型,使用元素类型、分号和长度。

    数组类型声明示例

    fn main() {
        let a: [i32; 5] = [1, 2, 3, 4, 5];
    }
    
    • 可以使用重复值初始化数组。

    重复值初始化数组示例

    fn main() {
        let a = [3; 5];
    }
    

    访问数组元素

    • 通过索引访问数组元素,索引从 0 开始。

    访问数组元素示例

    fn main() {
        let a = [9, 8, 7, 6, 5];
    
        let first = a[0]; // 获取第一个元素
        let second = a[1]; // 获取第二个元素
    }
    

    越界访问

    • 使用超出数组长度的索引将导致程序 panic。

    越界访问示例

    fn main() {
        let a = [1, 2, 3, 4, 5];
    
        let index = 5; // 索引超出数组长度
        let element = a[index]; // 将导致 panic
        println!("The value of the element at index {} is: {}", index, element);
    }
    

    数组元素为非基础类型

    • 数组元素不能简单地复制非基本类型,如 String。

    数组元素非基础类型错误示例

    fn main() {
        let array = [String::from("rust is good!"); 8]; // 错误:String 不实现 Copy 特征
    }
    
    • 使用 std::array::from_fn 创建包含复杂类型的数组。

    使用 from_fn 创建数组示例

    fn main() {
        let array: [String; 8] = std::array::from_fn(|_i| String::from("rust is good!"));
        println!("{:#?}", array);
    }
    

    数组切片

    • 数组切片允许引用数组的一部分。

    数组切片示例

    fn main() {
        let a: [i32; 5] = [1, 2, 3, 4, 5];
    
        let slice: &[i32] = &a[1..3];
        assert_eq!(slice, &[2, 3]);
    }
    

    总结

    • 数组类型与切片类型容易混淆,注意区分。
    • 数组的长度是其类型的组成部分。
    • 数组切片在实际开发中使用更多,因为具有固定大小。