Skip to content

Slice 类型 ​

slice 允许你引用集合中一段连续的元素序列, 而不用引用整个集合, slice 是一种引用, 所以它没有所有权

字符串类型的 slice ​

rust
fn main() {
    let string = String::from("hello world");
    let str = &string[6..11]; // 表示 6-11

    // 这个语法中的开始和结尾是可以省略的
    let str1 = &string[...5]; // 表示 0-5
    let str2 = &string[6...]; // 表示 6 到最后
    let str3 = &stirng[..];   // 表示最前到最后

    println!("str: {str}");
    println!("str1: {str1}");
    println!("str2: {str2}");
    println!("str3: {str3}");
}

字符串字面值就是 slice ​

rust
fn main() {
    // 注意这俩的区别
    let str: &str = "hello";
    let string: String = String::from("world");
    println!("str: {str}");
    println!("string: {string}");
}

slice 作为函数参数和返回值 ​

rust
fn first_world(str: &str) -> &str {
    // 将字符串/切片转字符数组 ['h', 'e', 'l', 'l', 'o']
    let bytes = str.as_bytes();

    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return &str[0..i];
        }
    }
    // &str[..] 可能会有警告, 所以建议修改为这样
    &str[0..bytes.len()]
}

fn main() {
    let str = String::from("hello world");

    // &str 是 &String, 但是可以看做 &str[..]
    // 这样就可以同时兼容 &String 和 &str 类型
    let sub_str = first_world(&str);
    println!("sub_str: {sub_str}");
}

数组类型的 slice ​

rust
fn main() {
    let arr: [i8; 5] = [1, 2, 3, 4, 5];
    let sub_arr = &arr[0..3];

    let mut i = 0;
    while i < sub_arr.len() {
        println!("i={}", sub_arr[i]);
        i += 1;
    }
}

Vec 类型的 slice ​

rust
fn main() {
    let mut vec = vec![1, 2, 3];
    vec.push(4);
    vec.push(5);

    let sub_vec = &vec[0..3];
    for i in sub_vec.iter() {
        println!("i={}", i);
    }
}

Released under the MIT License.