Combinadores de Option
Option fornece combinadores para transformar e encadear valores opcionais sem match aninhado.
Receita
fn port_from_env() -> Option<u16> {
std::env::var("PORT").ok()
.and_then(|s| s.parse().ok())
}Quando usar isso: Pipelines onde a ausência é normal, não um erro que requer Result.
Exemplo de Trabalho
struct User { name: String, nickname: Option<String> }
fn display_name(u: &User) -> String {
u.nickname.as_ref()
.map(|n| format!("{} ({})", u.name, n))
.unwrap_or_else(|| u.name.clone())
}
fn main() {
let u = User { name: "Ada".into(), nickname: Some("ad".into()) };
println!("{}", display_name(&u));
}O que isso demonstra:
map/as_refevitam moverunwrap_or_elsepadrão preguiçoso- Tratamento de campo opcional sem pânico
Mergulho Profundo
Métodos chave: map, and_then, filter, or, or_else, unwrap_or, unwrap_or_default, ok_or, transpose, zip.
Armadilhas
- unwrap em produção - Causa pânico em
None. Correção:unwrap_orou?comok_or. - Mover com
mapem Option possuído - Consome. Correção:as_ref/as_mut. - Option<Option<T>> aninhado -
flatten(1.29+). - Confundir
andvsand_then-andsubstitui por um Option constante. Correção: Leia a documentação de cada método. - Option vs Result - Use
ok_orquando a ausência for um erro.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
match | Ramos complexos | Cadeia de map simples |
if let | Um padrão | Cadeia longa de combinadores |
Result | Necessita de motivo de erro | Ausência legítima |
MaybeUninit | não inicializado (unsafe) | Valor opcional normal |
FAQs
? em Option?
Em funções que retornam apenas Option.collect Option?
Não é comum - use collect de Result.zip?
Pareia dois Options se ambos forem Some.replace?
Pega o valor deixando None.take?
Move para fora deixando None.transpose Result?
Result<Option<T>,E> <-> Option<Result<T,E>>.async Option?
Combine com crates OptionExt de futures se necessário.clippy?
manual_flatten etc.serde Option?
Pula campos None por padrão.Default?
unwrap_or_default requer T: Default.Relacionados
- Option & Result como Enums
- if let, let else & while let
- O Operador ?
- Iteradores Falíveis & collect()
Versões do Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.