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 imprimir s?
This slide should take about 10 minutes.
  • 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 de i32. Observe que o tipo de s (&[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 de a neste ponto durante a execução. PorĂ©m vocĂȘ pode ler os dados de a e s com segurança. Isto funciona antes da criação do slice, e novamente depois de println, quando o slice nĂŁo Ă© mais necessĂĄrio.