Desafio Rust
Invertendo palavras de uma frase
Enunciado
Dada a frase "Rust é uma linguagem segura e rápida", crie uma nova String com as palavras em ordem inversa, separadas por um espaço. Utilize slices para extrair cada palavra e depois construa a string final. Imprima o resultado.
Requisitos
- Use slices (
&str) para obter cada palavra a partir da string original. - Construa uma
Stringnova com as palavras invertidas. - Não use
split_whitespace().rev().collect::<Vec<_>>().join(" ")diretamente; faça a inversão manualmente com um vetor de slices.
Código inicial
fn main() {
let frase = "Rust é uma linguagem segura e rápida";
// seu código aqui
}
Saída esperada
rápida e segura linguagem uma é Rust
Ver dica
Você pode usar split_whitespace() para obter um iterador de &str, coletar em um Vec<&str>, inverter o vetor com .reverse() e depois juntar com join(" ").
Mostrar solução
fn main() {
let frase = "Rust é uma linguagem segura e rápida";
// Coleta slices de palavras em um vetor
let mut palavras: Vec<&str> = frase.split_whitespace().collect();
// Inverte a ordem das palavras
palavras.reverse();
// Junta as palavras em uma nova String
let invertida: String = palavras.join(" ");
println!("{}", invertida);
}
Passo a passo
frase.split_whitespace()retorna um iterador de&str, cada um apontando para uma palavra na string original..collect()transforma o iterador em umVec<&str>, armazenando os slices.palavras.reverse()inverte a ordem dos elementos no vetor.palavras.join(" ")concatena os slices com um espaço entre eles, criando uma novaString.- Imprimimos a string resultante.
Por que funciona
Cada palavra é um slice que referencia a string original, sem alocação extra. O vetor palavras contém esses slices. Ao inverter o vetor, mudamos apenas a ordem das referências. O método join percorre o vetor e constrói uma nova String com os pedaços, alocando memória apenas para o resultado final. Isso é eficiente e seguro, pois os slices permanecem válidos enquanto frase existir.
Erros comuns
- Tentar modificar a string original enquanto os slices existem: se
frasefosse mutável e tentássemos alterá-la, o compilador impediria porque há empréstimos ativos. - Usar
split(' ')em vez desplit_whitespace(): se houver múltiplos espaços,split(' ')produziria strings vazias.split_whitespace()lida com qualquer espaço em branco. - Esquecer de declarar
palavrascomo mutável:reverse()requer&mut self, então o vetor precisa sermut. - Tentar indexar a string com
frase[0..4]sem verificar limites UTF-8: aqui usamossplit_whitespace(), que é seguro.
Outra forma de resolver
Usar split_whitespace().rev().collect::<Vec<_>>().join(" ") em uma linha. É mais conciso, mas o exercício pede a inversão manual com vetor.
Saída esperada
rápida e segura linguagem uma é Rust