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 String nova 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

  1. frase.split_whitespace() retorna um iterador de &str, cada um apontando para uma palavra na string original.
  2. .collect() transforma o iterador em um Vec<&str>, armazenando os slices.
  3. palavras.reverse() inverte a ordem dos elementos no vetor.
  4. palavras.join(" ") concatena os slices com um espaço entre eles, criando uma nova String.
  5. 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 frase fosse mutável e tentássemos alterá-la, o compilador impediria porque há empréstimos ativos.
  • Usar split(' ') em vez de split_whitespace(): se houver múltiplos espaços, split(' ') produziria strings vazias. split_whitespace() lida com qualquer espaço em branco.
  • Esquecer de declarar palavras como mutável: reverse() requer &mut self, então o vetor precisa ser mut.
  • Tentar indexar a string com frase[0..4] sem verificar limites UTF-8: aqui usamos split_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