【Rust】——切片

简介: 【Rust】——切片

🎯前言

       在引入切片之前,咱们先看一道题,编写一个函数,该函数接收一个用空格分隔单词的字符串,并返回在该字符串中找到的第一个单词。如果函数在该字符串中并未找到空格,则整个字符串就是一个单词,所以应该返回整个字符串。


可能会有人这样写

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

       现在有了一个找到字符串中第一个单词结尾索引的方法,不过这有一个问题。我们返回了一个独立的 usize,不过它只在 &String 的上下文中才是一个有意义的数字。换句话说,因为它是一个与 String 相分离的值,无法保证将来它仍然有效。


然而,Rust 为这个问题提供了一个解决方法:字符串 slice。


🎯引入字符串切片

String 中一部分值的引用,它看起来像这样:

    let s = String::from("hello world");
 
    let hello = &s[0..5];
    let world = &s[6..11];

       不同于整个 String 的引用,hello 是一个部分 String 的引用,由一个额外的 [0..5] 部分指定。可以使用一个由中括号中的 [starting_index..ending_index] 指定的 range 创建一个 slice,其中 starting_index 是 slice 的第一个位置,ending_index 则是 slice 最后一个位置的后一个值。


       对于 Rust 的 .. range 语法,如果想要从索引 0 开始,可以不写两个点号之前的值。


       依此类推,如果 slice 包含 String 的最后一个字节,也可以舍弃尾部的数字


       提醒:字符串 slice range 的索引必须位于有效的 UTF-8 字符边界内,如果尝试从一个多字节字符的中间位置创建字符串 slice,则程序将会因错误而退出。


🎯用字符串切片

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

       那个当我们获取第一个单词结尾的索引后,接着就清除了字符串导致索引就无效的 bug 吗?那些代码在逻辑上是不正确的,但却没有显示任何直接的错误。问题会在之后尝试对空字符串使用第一个单词的索引时出现。slice 就不可能出现这种 bug 并让我们更早的知道出问题了 。


Rust 不允许 clear 中的可变引用和 word 中的不可变引用同时存在,因此编译失败。


🎯字符串字面值

       字符串字面值被储存在二进制文件中。

let s = "Hello, world!";

       这里 s 的类型是 &str:它是一个指向二进制程序特定位置的 slice。这也就是为什么字符串字面值是不可变的;&str 是一个不可变引用。


字符串切片作为参数传递:


       如果有一个字符串 slice,可以直接传递它。如果有一个 String,则可以传递整个 String 的 slice 或对 String 的引用。


        String 引用的函数使得我们的 API 更加通用并且不会丢失任何功能

目录
相关文章
|
Rust 索引
【RUST学习日记】第12课 切片引用(Slice)
【RUST学习日记】第12课 切片引用(Slice)
【RUST学习日记】第12课 切片引用(Slice)
|
Rust 编译器 API
【Rust指南】结合String深入理解Rust语言的Slice(切片)类型
【Rust指南】结合String深入理解Rust语言的Slice(切片)类型
276 0
【Rust指南】结合String深入理解Rust语言的Slice(切片)类型
|
4天前
|
Rust 安全 程序员
|
4天前
|
Rust 安全 程序员
Rust vs Go:解析两者的独特特性和适用场景
在讨论 Rust 与 Go 两种编程语言哪种更优秀时,我们将探讨它们在性能、简易性、安全性、功能、规模和并发处理等方面的比较。同时,我们看看它们有什么共同点和根本的差异。现在就来看看这个友好而公平的对比。
|
8月前
|
Rust Go C++
Rust vs Go:常用语法对比(十三)(1)
Rust vs Go:常用语法对比(十三)(1)
63 0
|
8月前
|
Rust Go C++
Rust vs Go:常用语法对比(七)(1)
Rust vs Go:常用语法对比(七)(1)
48 0
|
8月前
|
Rust Go C++
Rust vs Go:常用语法对比(四)(1)
Rust vs Go:常用语法对比(四)(1)
122 0
|
8月前
|
Rust Go C++
Rust vs Go:常用语法对比(十三)(2)
Rust vs Go:常用语法对比(十三)(2)
73 1
|
8月前
|
Rust Go C++
Rust vs Go:常用语法对比(十二)(2)
Rust vs Go:常用语法对比(十二)(2)
59 0
|
8月前
|
Rust Go C++
Rust vs Go:常用语法对比(十二)(1)
Rust vs Go:常用语法对比(十二)(1)
64 0