Adeus NULL: Option e Result
Tratamento de erros funcional, seguro e expressivo com Enums.
Tentar acessar NULL custou bilhões de dólares à indústria.
Em Rust, null não existe. Se um valor pode estar ausente, ele é um Option.
Option <T>
enum Option<T> {
Some(T),
None,
}
Você é obrigado a tratar o caso None. Não dá para “esquecer”.
let config: Option<String> = carregar_config();
match config {
Some(texto) => println!("Config: {}", texto),
None => println!("Usando padrão..."),
}
Unwrapping Seguro
Use métodos combinadores para evitar match verbosos:
unwrap_or(padrao): Retorna valor ou padrão.map(|x| ...): Transforma o valor se existir, ignora se for None.
Result <T, E>
Para erros recuperáveis (I/O, Parsing).
enum Result<T, E> {
Ok(T),
Err(E),
}
O operador ? propaga o erro para cima. É a versão limpa do if (err != 0) return err; do C.
use std::fs::File;
use std::io::Read;
fn ler_arquivo_texto() -> Result<String, std::io::Error> {
// Se File::open falhar, retorna o Erro AGORA.
// Se der certo, 'f' recebe o File.
let mut f = File::open("dados.txt")?;
let mut s = String::new();
f.read_to_string(&mut s)?; // O mesmo aqui
Ok(s) // Retorna Ok com a string no final
}
Pattern Matching Poderoso
O match do Rust é um switch-case com esteróides. Ele pode desestruturar structs e tuplas.
match resposta_http {
Result::Ok(200) => println!("Sucesso"),
Result::Ok(404) => println!("Não encontrado"),
Result::Err(e) => println!("Falha na conexão: {}", e),
_ => println!("Outro código"),
} Progresso do Tópico