Rust slice 切片

发布时间: 更新时间: 总字数:607 阅读时间:2m 作者: IP属地: 分享 复制网址

在 Rust 中,切片(slice)也是一种不持有所有权的数据类型。

切片

字符串切片

字符串切片是指向字符串中一部分内容的引用

  • &str 表示字符串切片的类型
  • 形式:[开始索引..结束索引][开始索引..=结束索引-1]
    • 开始索引:切片起始位置的索引,默认为 0,可省略
    • 结束索引:切片终止位置的索引+1,默认为字符串长度,也可省略
    • &s[0..str.len()] 等价于 &s[..]
  • 切片的值只有指针和长度组成,没有capacity,因为其与原来的变量共用内存空间
  • 说明:
    • 字符串切片的索引范围必须发生在有效的 UTF-8 字符边界内
    • 多字节的字符中创建字符串切片,程序报错
fn main() {
    let s = String::from("Hello world");
    let hello = &s[0..5];
    let world = &s[6..11];

    println!("{}, {}", hello, world);
    println!("{}, {}", &s[0..=4], &s[6..=10]);

    println!("first word is {}", first_world(&s))
}

fn first_world(s: &String) -> &str {
    let bytes = s.as_bytes();
    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return &s[..i];
        }
    }

    &s[..]
}

字符串切片值

字符串切片值(类型为 &str)被直接存储在二进制程序中:

  • &str 是不可变引用,所以字符串字面值也是不可变的
fn main() {
    let s: &str = "Hello world";  // 变量 s 的类型为 &str,指向二进制程序特定位置的切片
    println!("{}", s)
}

字符串切片作为参数

在上面的例子(fn first_world(s: &String) -> &str {)中,我们使用 &String 接受参数,在 Rust 中推荐使用 &str 作为参数类型,且可以接受 String&str 类型的参数,即:

  • fn first_world(s: &str) -> &str {,上面例子中调用时使用 first_world(&s[..])
    • 使用字符串切片,直接调用该函数
    • 使用 String,可以创建一个完整的 String 切片来调用该函数

数组切片

i32 为例,数组切片的类型为 &[i32],组成:

  • 指向原数组的指针
  • 切片长度

示例:

fn main() {
    let arr:[i32; 5] = [1, 2, 3, 4, 5];
    let slice: &[i32] = &arr[..2];
    println!("{} {}", slice[0], slice[1]);
}
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数