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]); }