Caso de Teste: Lista Ligada
Um maneira comum de implementar uma lista ligada é através de enums
:
use crate::List::*;enum List {// Cons: estrutura de tipo que envolve um elemento e// um ponteiro para o próximo nó.Cons(u32, Box<List>),// Nil: Um nó que significa o fim da lista ligadaNil,}// Os métodos podem ser anexados à numa enumeraçãoimpl List {// Criar uma lista vaziafn new() -> List {// `Nil` tem o tipo `List`Nil}// Consumir uma lista, e retornar a mesma lista com// um novo elemento na sua frentefn prepend(self, elem: u32) -> List {// `Cons` também tem o tipo `List`Cons(elem, Box::new(self))}// Retornar o comprimento da listafn len(&self) -> u32 {// `self` precisa ser correspondido, porque o comportamento deste método// depende da variante do `self`.// `self` tem o tipo `&List`, e `*self` tem o tipo `List`,// correspondência dum tipo concreto `T` é preferida sobre// uma correspondência numa referência `&T`, depois da Rust 2018// podes usar `self` aqui e também perseguir (sem referência) abaixo,// Rust inferirá `&s` e referenciará a cauda.// See https://doc.rust-lang.org/edition-guide/rust-2018/ownership-and-lifetimes/default-match-bindings.htmlmatch *self {// Não possível tomar posse da cauda, porque `self` é emprestado;// ao invés disto recebe uma referência à caudaCons(_, ref tail) => 1 + tail.len(),// Caso de Base: Uma lista vaziam tem comprimento zeroNil => 0}}// Retornar a representação da lista como uma// sequência de caracteres (monte alocado)fn stringify(&self) -> String {match *self {Cons(head, ref tail) => {// `format!` é semelhante à `print!`, mas retorna uma// sequência de caracteres de monte alocado de impressão// para a consola.format!("{}, {}", head, tail.stringify())},Nil => {format!("Nil")},}}}fn main() {// Criar uma lista ligada vazialet mut list = List::new();// Adicionar ao começo da lista alguns elementoslist = list.prepend(1);list = list.prepend(2);list = list.prepend(3);// Mostrar o estado final da listaprintln!("linked list has length: {}", list.len());println!("{}", list.stringify());}