Manipulação de Strings
Construa e transforme strings com push, push_str, +, format!, e controle de capacidade.
Receita
fn join_parts(parts: &[&str]) -> String {
let mut out = String::new();
for (i, p) in parts.iter().enumerate() {
if i > 0 { out.push(' '); } // Adiciona um espaço antes de cada parte, exceto a primeira.
out.push_str(p); // Anexa a string da parte atual.
}
out
}Quando usar isso: Montagem de saída, normalização de texto, padrões de builder.
Exemplo de Trabalho
fn with_capacity_join(items: &[&str]) -> String {
// Calcula o comprimento total necessário, incluindo os delimitadores.
let len: usize = items.iter().map(|s| s.len()).sum::<usize>() + items.len();
// Cria uma String com capacidade pré-alocada para evitar realocações.
let mut s = String::with_capacity(len);
for (i, item) in items.iter().enumerate() {
if i > 0 { s.push(','); } // Adiciona uma vírgula como delimitador, exceto antes do primeiro item.
s.push_str(item); // Anexa o item atual à string.
}
s
}O que isso demonstra:
with_capacityreduz a realocação.- Construção in-place vs
format!em loop. +consome aStringda esquerda; prefirapush_str.
Mergulho Profundo
insert, insert_str, replace, replacen, drain, clear, truncate (baseado em bytes!). split, lines, trim.
Armadilhas
s1 + &s2moves1: O operando esquerdo é consumido. Correção:format!("{s1}{s2}")oupush_str.truncatedivide codepoints: Inválido se no meio de um caractere. Correção: Truncamento ciente de caracteres.format!repetido em loop: Alocações. Correção: Buffer único comwrite!oupush_str.replacealoca: Nova string a cada chamada. Correção: In-place se o padrão for raro.clearretém a capacidade: Bom para reutilizar buffers.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
format! | Poucas junções | Builder de loop intenso |
write! para String | Traits fmt | Concatenação simples |
itertools::join | Junção de iterador | Já tem Vec |
FAQs
capacidade?
Métodos `len` vs `capacity`.shrink_to_fit?
Retorna alocação excedente.insert_str?
Índice de byte - limite de caractere!pop?
Remove o último caractere, não byte.split_whitespace?
Iterador de partes `&str`.to_lowercase?
Aloca nova `String`.métodos ascii?
`to_ascii_uppercase` etc.bytes mut?
Evitar padrão `unsafe` de `as_mut_vec`.serde?
String é transparente.smallstr?
Crates de string inline.Relacionados
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+.