Vetores e Pedaços
Um vetor é uma coleção de objetos do mesmo tipo T
, armazenados na memória contígua. Os vetores são criados usando parênteses retos []
, e o seu comprimento, que é conhecido em tempo de compilação, é parte da sua assinatura de tipo [T; length]
.
Os pedaços são semelhantes aos vetores, mas seu comprimento não é conhecido em tempo de compilação. Ao invés disto, um pedaço é um objeto de duas palavras; a primeira palavra é um ponteiro para o dado, e a segunda palavra o comprimento do pedaço. O tamanho da palavra é o mesmo que não ter tamanho usize
, determinado pela arquitetura do processador, por exemplo, 64 bits numa x86-64. Os pedaços podem ser usados para pedir emprestado uma seção dum vetor e têm a assinatura de tipo &[T]
:
use std::mem;// Esta função pedi emprestado um pedaço.fn analyze_slice(slice: &[i32]) {println!("First element of the slice: {}", slice[0]);println!("The slice has {} elements", slice.len());}fn main() {// Vetor de tamanho fixo (assinatura de tipo é supérflua).let xs: [i32; 5] = [1, 2, 3, 4, 5];// Todos os elementos podem ser inicializados para o mesmo valor.let ys: [i32; 500] = [0; 500];// A indexação começa em 0.println!("First element of the array: {}", xs[0]);println!("Second element of the array: {}", xs[1]);// `len` retorna a contagem de elementos no vetor.println!("Number of elements in array: {}", xs.len());// Os vetores são pilhas alocadas.println!("Array occupies {} bytes", mem::size_of_val(&xs));// Os vetores podem ser pedidos emprestado como pedaços.println!("Borrow the whole array as a slice.");analyze_slice(&xs);// Os pedaços podem apontar para uma seção dum vetor.// Eles são da forma [starting_index..ending_index].// `starting_index` é a primeira posição no pedaço.// `ending_index` é a última posição no pedaço.println!("Borrow a section of the array as a slice.");analyze_slice(&ys[1 .. 4]);// Exemplo de pedaço vazio `&[]`:let empty_array: [u32; 0] = [];assert_eq!(&empty_array, &[]);assert_eq!(&empty_array, &[][..]); // O mesmo mas mais verboso// Os vetores podem ser acessados seguramente usando `.get`, que retorna// uma `Option`. Isto pode ser correspondido como mostrado abaixo, ou usado// com `.expect()` se gostarias que o programa saísse com uma mensagem// agradável ao invés de felizmente continuar.for i in 0..xs.len() + 1 { // Oops, um elemento longe de mais!match xs.get(i) {Some(xval) => println!("{}: {}", i, xval),None => println!("Slow down! {} is too far!", i),}}// Indexação fora do limite no vetor causa erro de tempo de compilação.//println!("{}", xs[5]);// // Indexação fora do limite no pedaço causa erro de tempo de execução.//println!("{}", xs[..][5]);}