English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Rust Slice(切片)类型

切片(Slice)是对数据值的部分引用。

切片这个名字往往出现在生物课上,我们做样本玻片的时候要从生物体上获取切片,以供在显微镜上观察。在 Rust 中,切片的意思大致也是这样,只不过它从数据取材引用。

字符串切片

最简单、最常用的数据切片类型是字符串切片(String Slice)。

fn main() {
    let s = String::from("broadcast");
    let part1 = &s[0..5];
    let part2 = &s[59];
    println!("{}={}+{}", s, part1, part2);
}

Resultado da Execução:

broadcast=broad+cast

上图解释了字符串切片的原理(注:Rust 中的字符串类型实质上记录了字符在内存中的起始位置和其长度,我们暂时了解到这一点)。

使用 .. 表示范围的语法在循环章节中出现过。x..y 表示 [x, y) 的数学含义。.. 两边可以没有运算数:

..y 等价于 0..y
x.. 等价于位置 x 到数据结束
.. 等价于位置 0 到结束

注意:到目前为止,尽量不要在字符串中使用非英文字符,因为编码的问题。具体原因会在"字符串"章节叙述。

被切片引用的字符串禁止更改其值:

fn main() {
    let mut s = String::from("w3codebox");
    let slice = &s[0..3];
    s.push_str("yes!"); // 错误
    println!("slice = {}", slice);
}

这段程序不正确。

s 被部分引用,禁止更改其值。

Na verdade, até agora, você deve estar疑惑 por que, a cada uso de string, é necessário escrever assim String::from("w"))3codebox) "w3codebox" "w

Por que não? codebox

Todos os constantes de strings entre aspas duplas têm a propriedade de tipo integral. &str:

let s = "hello";

Aqui, s é uma variável do tipo &str.

O tipo String é um tipo de dados fornecido pela biblioteca pública padrão do Rust, que tem mais funcionalidades - ele suporta operações úteis como adição de strings e limpeza. Além dos atributos de posição inicial de caractere e comprimento da string, String e str também têm um atributo de capacidade (capacity).

String e str suportam fatias, e o resultado é um tipo de dados &str.

Atenção: o resultado da fatia deve ser um tipo de referência, mas o desenvolvedor deve explicitar isso:

let slice = &s[0..3];

Há uma maneira rápida de converter String para &str:

let s1 = String::from("hello");
let s2 = &s1[..];

Fatias Não-String

Além das strings, outras estruturas de dados lineares também suportam operações de fatias, por exemplo, arrays:

fn main() {
    let arr = [1, 3, 5, 7, 9];
    let part = &arr[0..3];
    for i in part.iter() {
        println!("{}", i);
    }
}

Resultado da Execução:

1
3
5