Coleção Vec
Em Rust já temos coleções implementadas, uma delas é a Vec<T>, é uma coleção que armazena uma quantidade de elementos. A vantagem de usar essa coleção é que diferente de um array é que seu tamanho é flexível. O que nos da certa vantagem. Podemos criar um Vec com os métodos estáticos new ou with_capacity, ou com o macro vec!, sendo a opção com o macro um Vec já inicializado com valores. Podemos declarar o Vec
fn main() { let mut vec = Vec::<i32>::new(); let mut vec2: Vec<i32> = Vec::new(); let mut vec3 = Vec::<i32>::with_capacity(10); //inicia o Vec já com uma capacidade let mut vec4: Vec<i32> = Vec::with_capacity(10); //inicia o Vec já com uma capacidade let mut vec5 = vec![1,2,3]; }
Iniciar um Vec já com uma capacidade o que nos da vantagem de deixar mais rápido a inserção de novos elementos nesse Vec, mas não vamos confundir a capacidade dele, com o tamanho dele, a capacidade é "o quanto cabe" e o tamanho é o "o quanto tem".
Note que declaramos todos os Vec como mutáveis, não é obrigatório serem declarados como mutáveis, nós só utilizamos isso caso queiramos realizar qualquer modificação no Vec, como adicionar, ou remover valores do mesmo.
O compilador do Rust é inteligente o suficiente para saber o tipo de um Vec pelo primeiro elemento adicionado.
Métodos de Vec
Em Vec temos diversos métodos, mas agora iremos falar sobre os seguintes métodos: push, pop, len, clear, is_empty, contains, get, get_mut, insert e remove.
Método push
O método push é responsável por adicionar um elemento ao Vec, o método ira falhar caso a capacidade do Vec ultrapasse o valor máximo de um isize
fn main() { let mut lista = Vec::new(); lista.push(10); println!("{:?}", lista); }
Método insert
Com o método insert conseguimos adicionar um valor na posição escolhida
fn main() { let mut lista = vec![1, 2, 3]; lista.insert(0, 4); println!("{:?}", lista); }
Método pop
O método pop remove o último elemento do Vec e nos retornar um Option<T>, sendo o Some caso tenha algum elemento e None caso o Vec esteja vazio.
fn main() { let mut lista = vec![1, 2, 3]; let ultimo: Option<i32> = lista.pop(); println!("{:?}", lista); }
Método len
O método len retorna o tamanho do Vec
fn main() { let lista = vec![1,2,3]; let tamanho = lista.len(); println!("{}", tamanho); }
Método get
O método get retorna um Option<&T> caso a posição solicitada exista, caso não exista é retornado um None, a vantagem de utilizar este método ao invés de um colchete e a posição [pos] é que se tentarmos acessar uma posição inexistente não paramos a execução da aplicação.
fn main() { let lista = vec![1,2,3]; let primeiro_elemento: Option<&i32> = lista.get(0); // let invalido = lista[1000]; //esta linha ira parar a execução do programa }
Método get_mut
O método get_mut, tem um comportamento parecido com o do método get a principal diferença é que este método nos retorna uma referncia mutável, sendo assim, podemos alterar o valor contido no index. Para que este método possa ser executado, o Vec deve ser mutável
fn main() { let mut lista = vec![1, 2, 3]; let r = lista.get_mut(0).unwrap(); *r = 10; println!("{:?}", lista); }
Método remove
Com o método remove, podemos remover um item do Vec informando a sua posição. Claro para isso o Vec deve ser mutável.
fn main() { let mut lista = vec![1, 2, 3]; lista.remove(0); println!("{:?}", lista); }
Método clear
O método clear limpa o Vec o deixando vazio
fn main() { let mut lista = vec![1,2,3]; lista.clear(); println!("Tamanho da lista {}", lista.len()); }
Método is_empty
O método is_empty retorna um booleano, sendo true caso esteja vazio e false caso o tenha algum elemento
fn main() { let lista = Vec::<i32>::new(); if lista.is_empty() { println!("A lista esta vazia"); } }
Método contains
O método containsretorna um booleano, sendo true caso o valor exista e false caso não exista.
fn main() { let lista = vec![1, 2, 3]; if lista.contains(&3) { println!("O numero 3 existe na lista"); } }