Iniciante Fundamentos
Enums e Option
Um enum define um tipo que pode ser uma entre várias variantes. É muito usado junto com match para tratar cada caso.
Definir um enum
enum Direcao {
Norte,
Sul,
Leste,
Oeste,
}
fn main() {
let d = Direcao::Norte;
mover(d);
}
fn mover(d: Direcao) {
match d {
Direcao::Norte => println!("Subindo"),
Direcao::Sul => println!("Descendo"),
Direcao::Leste => println!("Direita"),
Direcao::Oeste => println!("Esquerda"),
}
}
Variantes com dados
Cada variante pode carregar dados.
enum Mensagem {
Sair,
Mover { x: i32, y: i32 },
Escrever(String),
}
fn processar(m: Mensagem) {
match m {
Mensagem::Sair => println!("Saindo"),
Mensagem::Mover { x, y } => println!("Mover ({}, {})", x, y),
Mensagem::Escrever(texto) => println!("{}", texto),
}
}
fn main() {
processar(Mensagem::Escrever(String::from("oi")));
}
Option
Rust não tem null. Para representar “pode existir ou não” usa-se Option, que é Some(valor) ou None.
fn main() {
let nota: Option<i32> = Some(8);
let vazio: Option<i32> = None;
match nota {
Some(n) => println!("Nota: {}", n),
None => println!("Sem nota"),
}
// valor padrão se for None
println!("{}", vazio.unwrap_or(0));
}
O compilador obriga você a tratar o caso None, evitando erros de valor nulo.