Formatação e Impressão
Rust formata texto com macros (println!, format!, write!) suportadas pelos traits std::fmt Display e Debug. Especificadores de formato controlam largura, precisão e alinhamento.
Receita
#[derive(Debug)]
struct User { id: u64, name: String }
fn main() {
let u = User { id: 1, name: "Ada".into() };
println!("{}", u.name);
println!("{:?}", u);
println!("{:#?}", u);
eprintln!("log: id={}", u.id);
}Quando usar isso: Saída de CLI, logs, falhas de teste e implementação de formas de string visíveis ao usuário para seus tipos.
Exemplo de Trabalho
use std::fmt;
struct Point { x: i32, y: i32 }
impl fmt::Display for Point {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "({}, {})", self.x, self.y)
}
}
fn main() {
let p = Point { x: 3, y: 4 };
println!("point={p}");
println!("{:>10}", p);
let s = format!("moved {p}");
assert_eq!(s, "moved (3, 4)");
}O que isto demonstra:
- Implementação manual de
Displaypara formatação personalizada - Largura de alinhamento
{:>10}alinha à direita em 10 colunas format!aloca umaStringeprintln!escreve para stderr
Mergulho Profundo
Macros Comuns
| Macro | Saída | Retorna |
|---|---|---|
println! | stdout + nova linha | () |
print! | stdout | () |
eprintln! | stderr + nova linha | () |
format! | nenhuma | String |
write! / writeln! | qualquer fmt::Write | Result |
Especificadores de Formato
println!("{:.2}", 3.14159); // 3.14
println!("{:08x}", 255); // 000000ff
println!("{name}", name = "Rust"); // argumentos nomeadosDebug vs Display
Debug: orientado a desenvolvedor, frequentemente derivadoDisplay: voltado ao usuário, implementação manual necessária para tipos personalizados#?imprimeDebugde forma formatada com indentação
Armadilhas
println!(my_struct)semDisplay- Erro de compilação. Correção: DeriveDebuge use{:?}, ou implementeDisplay.- Formatação de não-UTF-8 para usuários -
Debugpode escapar strings de forma estranha. Correção: ImplementeDisplaypara texto legível. - Usar
format!em loops críticos - Aloca a cada chamada. Correção: Usewrite!para um buffer ou reutilizeStringcomclear(). - Escapando chaves incorretamente -
{{e}}produzem chaves literais. Correção: Dobre as chaves em strings de formato. - Panicking em
Display::fmt- Deve retornarfmt::Error, não entrar em pânico. Correção: Propaguefmt::Result.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
Crates tracing / log | Logging de produção estruturado | Scripts rápidos |
serde_json::to_string | Saída legível por máquina | Tabelas CLI humanas |
std::io::Write diretamente | Protocolos binários | Formatação de texto |
to_string() em primitivos | Conversão simples de escalar | Regras de layout personalizadas |
FAQs
Posso implementar `Display` e `Debug`?
Sim. Eles servem a públicos diferentes. Muitos tipos derivam Debug e implementam Display manualmente.
Como imprimir sem nova linha?
Use print! em vez de println!.
Qual é a API de preenchimento do `Formatter`?
f.pad_integral, f.precision(), f.width() leem especificadores dentro das implementações de fmt.
A formatação pode falhar?
write! retorna Result. println! entra em pânico em caso de erro de I/O (raro para stdout).
Como imprimir `Option` de forma agradável?
{:?} funciona. Para personalização: use match e formate o valor interno.
`Display` implica `ToString`?
Existe uma implementação genérica: tipos com Display obtêm to_string().
Posso usar cores ANSI?
Não no std. Crates como owo-colors envolvem a saída de Display.
E a macro `dbg!`?
Imprime o arquivo/linha e o valor da expressão para stderr. Útil para depuração rápida.
Como formatar iteradores?
Use itertools::format ou collect para Vec e depois join para separadores.
Formatação de números ciente do local?
O std não tem i18n. Use crates externos para regras de localidade.
Relacionados
- Noções Básicas de Strings -
Stringvs&str - Formatação - padrões de formato avançados
- Derivando Traits -
#[derive(Debug)] - Traits Padrão Comuns -
Display,Debug
Versões da Pilha: 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+.