Parsing & Conversão
Analise strings para tipos com str::parse / FromStr. Converta para string via to_string, Display, ou format!.
Receita
fn parse_port(s: &str) -> Result<u16, std::num::ParseIntError> {
s.trim().parse()
}Quando usar isso: Configurações, argumentos de linha de comando, campos de protocolo, validação de entrada do usuário.
Exemplo Funcional
use std::str::FromStr;
#[derive(Debug)]
struct Color { r: u8, g: u8, b: u8 }
impl FromStr for Color {
type Err = &'static str;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let mut parts = s.split(',');
let r: u8 = parts.next().ok_or("r")?.parse().map_err(|_| "r")?;
let g: u8 = parts.next().ok_or("g")?.parse().map_err(|_| "g")?;
let b: u8 = parts.next().ok_or("b")?.parse().map_err(|_| "b")?;
Ok(Color { r, g, b })
}
}
fn main() {
println!("{:?}", "255,128,0".parse::<Color>());
}O que isso demonstra:
FromStrcustomizado para tipo de domínio- Turbofish
parse::<Color>() - Escolha do tipo de erro
&'static strou enum customizado
Análise Detalhada
From/Into para conversões infalíveis. TryFrom para conversões falíveis. parse requer FromStr.
Armadilhas
unwrapemparse- Pânico em entrada inválida. Correção:?oumatch.- Formatos numéricos de localidade -
parsenão é ciente da localidade. Correção: Crate dedicado. - Esquecer
trim- Espaços iniciais falham na análise de inteiros. Correção:trim(). - Consumo parcial da análise -
from_strdeve consumir tudo ou documentar o restante. utf8com perda -from_utf8_lossynão analisa números.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
serde deserialize | Dados estruturados | Escalar único |
nom / pest | Gramáticas complexas | Análise simples de inteiros |
| Capturar com Regex e depois analisar | Semi-estruturado | Analisador completo necessário |
FAQs
Inferência de `parse`?
Anote com turbofish ou tipo de ligação.Erro de `FromStr`?
Tipo associado por tipo.`from_str` para `bool`?
"true"/"false" via `parse`.`parse` para `f64`?
Questões de `PartialEq` de float são separadas.`parse` de hexadecimal?
`u32::from_str_radix`.`Display` vs `Debug` para string?
`to_string` via `Display`.`try_into`?
`String` para `Vec`parse` com `clap`?
`clap ValueParser`.`FromStr` sem `std`?
`core` para muitos primitivos.Testar erros de `parse`?
`assert!(s.parse::Relacionados
Versões da 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+.