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

Rust Slice(切片)类型

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

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

字符串切片

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

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

Resultado de la ejecución:

broadcast=amplificar+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("¡sí!"); // 错误
    println!("slice = {}", slice);
}

这段程序不正确。

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

En realidad, hasta ahora, debe haber sentido una confusión sobre por qué cada vez que se utiliza una cadena se debe escribir String::from("w"}}3codebox)) ,escriba directamente "w3codebox" "w

No está bien? codebox

Cualquier constante de cadena entre comillas dobles tiene una naturaleza de tipo &str

let s = "hello";

Aquí, s es una variable de tipo &str.

El tipo String es un tipo de datos proporcionado por la biblioteca pública estándar de Rust, que tiene más funciones completas: admite operaciones prácticas como el acoplamiento de cadenas y el vaciado.

Tanto String como str admiten rebanadas, y el resultado es de tipo &str.

Nota: el resultado de la rebanada debe ser un tipo de referencia, pero el desarrollador debe indicarlo claramente:

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

Hay una manera rápida de convertir String en &str:

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

Rebanadas no de cadena

Además de las cadenas, algunas estructuras de datos lineales también admiten operaciones de rebanadas, por ejemplo, los arrays:

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

Resultado de la ejecución:

1
3
5