English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
切片(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[..];
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