Slices (Fatias)
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 (_borrow) do tipo original.
- Pergunta: O que acontece se vocĂȘ modificar
a[3]
imediatamente antes de imprimirs
?
-
NĂłs criamos uma slice borrowing (emprestando)
a
e 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 (borrow) de outro objeto. Neste exemplo,
a
deve 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 dea
neste ponto durante a execução. PorĂ©m vocĂȘ pode ler os dados dea
es
com segurança. Isto funciona antes da criação do slice, e novamente depois deprintln
, quando o slice nĂŁo Ă© mais necessĂĄrio.