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