Referências e Slices
Referências emprestam dados sem tomar posse. Slices (&[T], &str) são visualizações emprestadas de sequências contíguas com comprimento em tempo de execução.
Busque em todas as páginas da documentação
Referências emprestam dados sem tomar posse. Slices (&[T], &str) são visualizações emprestadas de sequências contíguas com comprimento em tempo de execução.
fn first_word(s: &str) -> &str {
match s.find(' ') {
Some(i) => &s[..i],
None => s,
}
}
fn main() {
let sentence = String::from("hello world");
println!("{}", first_word(&sentence));
}Quando usar isso: Parâmetros de função que apenas leem dados, extração de substrings e passagem de visualizações de array sem cópia.
fn sum_slice(nums: &[i32]) -> i32 {
nums.iter().sum()
}
fn window(data: &[i32], start: usize, len: usize) -> Option<&[i32]> {
data.get(start..start + len)
}
fn main() {
let arr = [10, 20, 30, 40];
println!("sum={}", sum_slice(&arr));
println!("{:?}", window(&arr, 1, 2));
}O que isso demonstra:
&[i32] aceita arrays e Vec via coerçãostart..end em arrays e strings.get(range) retorna Option em vez de entrar em pânico&str de &String via coerção de desreferenciamento| Tipo | Acesso | Contagem por vez |
|---|---|---|
&T | Leitura compartilhada | Muitos |
&mut T | Escrita exclusiva | Um (sem & simultaneamente) |
let s = String::from("hello");
let slice: &str = &s[0..2]; // "he" - índices de byteUTF-8 significa que os índices de byte devem cair nos limites de caracteres ou o fatiamento entrará em pânico.
let a = [1, 2, 3, 4];
let mid: &[i32] = &a[1..3]; // [2, 3]fn head(tail: &[i32]) -> Option<(&i32, &[i32])> {
tail.split_first()
}.chars() ou unicode-segmentation para grafemas.String local - Erro de tempo de vida. Correção: Retorne String de propriedade ou pegue o proprietário como parâmetro.&Vec<T> com &[T] - Prefira &[T] em APIs. Correção: Use a forma de slice; &vec é coagido automaticamente.&mut para intervalos sobrepostos falham. Correção: Divida com split_at_mut.arr[99] entra em pânico. Correção: Use .get(99).| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
String/Vec de propriedade | O chamador transfere a propriedade | Inspeção somente leitura é suficiente |
Cow<'a, str> | Talvez empreste, talvez aloque | A propriedade é sempre clara |
| Índices + comprimento | Interoperabilidade FFI | APIs Rust seguras |
| Iteradores | Travessia preguiçosa | Acesso aleatório é necessário |
&String é coagido para &str, &Vec<T> para &[T] em locais de chamada de função quando o destino espera um slice.
Sim. &[] e &s[0..0] são slices vazios válidos.
len() é usize. Slices não podem exceder a alocação subjacente.
Slices são referências (ponteiros gordos). Os elementos não são copiados.
Sim. slice[0] = 1 muta o array subjacente ou Vec.
Ponteiro de baixo nível para o primeiro elemento. Usado em unsafe/FFI, não em código de aplicação típico.
slice.to_vec() para Vec de propriedade. slice.to_owned() quando T: Clone.
Não em Rust seguro. Use Option<&str> para ausência.
Ponteiro gordo de slice/str armazena o ponteiro de dados mais o comprimento (duas palavras).
&str em um tipo de retorno precisa de um tempo de vida vinculado à entrada. Veja a seção de Posse.
Versões da Pilha: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026