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.
Busque em todas as páginas da documentaçã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.
#[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.
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:
Display para formatação personalizada{:>10} alinha à direita em 10 colunasformat! aloca uma Stringeprintln! escreve para stderr| Macro | Saída | Retorna |
|---|---|---|
println! | stdout + nova linha | () |
print! | stdout | () |
eprintln! | stderr + nova linha | () |
format! | nenhuma | String |
write! / writeln! | qualquer fmt::Write | Result |
println!("{:.2}", 3.14159); // 3.14
println!("{:08x}", 255); // 000000ff
println!("{name}", name = "Rust"); // argumentos nomeadosDebug vs DisplayDebug: orientado a desenvolvedor, frequentemente derivadoDisplay: voltado ao usuário, implementação manual necessária para tipos personalizados#? imprime Debug de forma formatada com indentaçãoprintln!(my_struct) sem Display - Erro de compilação. Correção: Derive Debug e use {:?}, ou implemente Display.Debug pode escapar strings de forma estranha. Correção: Implemente Display para texto legível.format! em loops críticos - Aloca a cada chamada. Correção: Use write! para um buffer ou reutilize String com clear().{{ e }} produzem chaves literais. Correção: Dobre as chaves em strings de formato.Display::fmt - Deve retornar fmt::Error, não entrar em pânico. Correção: Propague fmt::Result.| 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 |
Sim. Eles servem a públicos diferentes. Muitos tipos derivam Debug e implementam Display manualmente.
Use print! em vez de println!.
f.pad_integral, f.precision(), f.width() leem especificadores dentro das implementações de fmt.
write! retorna Result. println! entra em pânico em caso de erro de I/O (raro para stdout).
{:?} funciona. Para personalização: use match e formate o valor interno.
Existe uma implementação genérica: tipos com Display obtêm to_string().
Não no std. Crates como owo-colors envolvem a saída de Display.
Imprime o arquivo/linha e o valor da expressão para stderr. Útil para depuração rápida.
Use itertools::format ou collect para Vec e depois join para separadores.
O std não tem i18n. Use crates externos para regras de localidade.
String vs &str#[derive(Debug)]Display, DebugVersõ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+.
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026