rust语言切片slice常用接口

Rust 语言中的切片(Slice),类型通常表示为 &[T](不可变引用)或 &mut [T](可变引用),是对连续内存区域的引用。切片本身不拥有数据,但提供了许多安全、高效的接口来操作底层数组或向量的数据。
以下是 &[T] 类型的一些常用接口(方法)及其使用示例:
常用切片接口概览
 
接口作用描述返回值类型示例
len() 获取切片中的元素数量。 usize
is_empty() 检查切片是否为空。 bool
first() / last() 获取第一个/最后一个元素的引用(安全)。 Option<&T>
get() 通过索引安全地访问元素,防止越界。 Option<&T>
split_at() 将切片在指定索引处分成两个子切片。 (&[T], &[T])
iter() 创建一个遍历切片的迭代器。 std::slice::Iter<T>
iter_mut() 创建一个遍历可变切片的可变迭代器。 std::slice::IterMut<T>
as_ptr() / as_mut_ptr() 转换为不安全的裸指针(用于 FFI/unsafe)。 *const T / *mut T
接口使用示例 Demo
fn main() {
    // 示例数据:一个不可变 i32 切片
    let data: &[i32] = &[10, 20, 30, 40, 50];
    
    // 示例数据:一个可变 u8 向量的切片引用
    let mut mutable_data = vec![1, 2, 3];
    let mutable_slice: &mut [u8] = &mut mutable_data;


    // --- 1. len() 和 is_empty() ---
    println!("--- 1. 长度与空检查 ---");
    println!("切片长度: {}", data.len());      // 输出: 5
    println!("切片是否为空: {}", data.is_empty()); // 输出: false


    // --- 2. first() 和 last() ---
    println!("\n--- 2. 首尾元素(安全访问) ---");
    // 这些方法返回 Option,需要模式匹配或 if let Some 处理
    if let Some(first_val) = data.first() {
        println!("第一个元素: {}", first_val); // 输出: 10
    }

    if let Some(last_val) = data.last() {
        println!("最后一个元素: {}", last_val); // 输出: 50
    }


    // --- 3. get() vs 索引操作 ---
    println!("\n--- 3. 索引访问(安全 vs 不安全) ---");
    // 标准索引操作 []:如果越界,程序将恐慌(panic)
    let third_element = data[2]; // 30
    println!("索引 2 的值: {}", third_element);

    // get() 方法:返回 Option<&T>,是安全的,不会 panic
    let safe_element = data.get(100); // 索引 100 不存在
    println!("安全获取索引 100: {:?}", safe_element); // 输出: None


    // --- 4. split_at() ---
    println!("\n--- 4. 分割切片 ---");
    // 在索引 3 处分割:前 3 个元素一组,剩下的元素一组
    let (left, right) = data.split_at(3);
    println!("左半部分: {:?}", left);  // 输出:
    println!("右半部分: {:?}", right); // 输出:


    // --- 5. iter() 和 iter_mut() ---
    println!("\n--- 5. 迭代器 ---");
    print!("不可变迭代 (iter()): ");
    for &item in data.iter() { // 使用 &item 来解引用
        print!("{} ", item);
    }
    println!();

    print!("可变迭代 (iter_mut()): ");
    for item in mutable_slice.iter_mut() {
        *item *= 2; // 通过可变引用修改原始数据
    }
    println!("修改后的可变切片: {:?}", mutable_slice); // 输出:


    // --- 6. as_ptr() ---
    println!("\n--- 6. 转换为裸指针 (as_ptr()) ---");
    let ptr: *const i32 = data.as_ptr();
    // 裸指针操作需要在 unsafe 块中进行
    unsafe {
        println!("裸指针指向的第一个值: {}", *ptr);
        println!("裸指针指向的第三个值: {}", *ptr.add(2));
    }
}
 
 
 
posted @ 2025-12-08 16:31  PKICA  阅读(0)  评论(0)    收藏  举报