Slices
Uma slice (fatia) oferece uma visão de uma coleção maior:
fn main() { let mut a: [i32; 6] = [10, 20, 30, 40, 50, 60]; println!("a: {a:?}"); let s: &[i32] = &a[2..4]; println!("s: {s:?}"); }
- Slices pegam dados emprestados do tipo original.
- Pergunta: O que acontece se você modificar
a[3]imediatamente antes de imprimirs?
-
Nós criamos uma slice emprestando
ae especificando os índices de início e fim entre colchetes. -
Se a slice começa no índice 0, a sintaxe de range (faixa) nos permite omitir o índice inicial, o que significa que
&a[0..a.len()]e&a[..a.len()]são idênticos. -
O mesmo vale para o último índice, logo
&a[2..a.len()]e&a[2..]são idênticos. -
Para criar facilmente uma slice de uma matriz completa, podemos utilizar
&a[..]. -
sé uma referência a uma slice dei32. Observe que o tipo des(&[i32]) não menciona mais o tamanho da matriz. Isso nos permite realizar cálculos em slices de tamanhos diferentes. -
As slices sempre pegam emprestado de outro objeto. Neste exemplo,
adeve permanecer ‘vivo’ (em escopo) por pelo menos tanto tempo quanto nossa slice. -
A questão sobre a modificação de
a[3]pode gerar uma discussão interessante, mas a resposta é que por motivos de segurança de memória você não pode fazer isso por meio deaneste ponto durante a execução, mas você pode ler os dados deaescom segurança. Isto funciona antes da criação do slice, e novamente depois deprintln, quando o slice não é mais necessário. Mais detalhes serão explicados na seção do verificador de empréstimos.