Fácil Rust
Empréstimo imutável
Enunciado
Escreva uma função primeira_palavra que recebe uma referência imutável a uma String e retorna a primeira palavra (até o primeiro espaço) como uma String nova. No main, crie uma String, chame a função e imprima o resultado. O dono original deve continuar válido após a chamada.
Requisitos
- A função deve aceitar
&String(ou&str) como parâmetro. - O
maindeve criar aStringe passar uma referência&. - Após a chamada, a
Stringoriginal deve ser usada novamente (por exemplo, impressa). - A saída deve mostrar a primeira palavra e depois a string completa.
Código inicial
fn primeira_palavra(s: &String) -> String {
// complete aqui
}
fn main() {
let texto = String::from("Rust é divertido");
// chame a função e imprima
}
Saída esperada
Primeira palavra: Rust
Texto completo: Rust é divertido
Ver dica
Use s.split_whitespace().next() para pegar a primeira palavra e converta para String com .to_string() ou .to_owned().
Mostrar solução
fn primeira_palavra(s: &String) -> String {
// split_whitespace divide por espaços e next pega o primeiro
s.split_whitespace().next().unwrap_or("").to_string()
}
fn main() {
let texto = String::from("Rust é divertido");
let palavra = primeira_palavra(&texto); // empréstimo imutável
println!("Primeira palavra: {}", palavra);
println!("Texto completo: {}", texto); // texto ainda é dono
}
Passo a passo
- A função
primeira_palavrarecebes: &String, ou seja, um empréstimo imutável. Ela não pode modificar a string original. s.split_whitespace()cria um iterador que separa a string por espaços em branco..next()pega o primeiro item do iterador, que é a primeira palavra. Se a string estiver vazia, retornaNone..unwrap_or("")trata o casoNoneretornando uma string vazia..to_string()cria uma novaStringcom o conteúdo da palavra, para poder retorná-la sem depender do empréstimo.- No
main, criamostextoe chamamosprimeira_palavra(&texto). O&cria a referência imutável. - Depois da chamada,
textocontinua válido e pode ser impresso novamente, pois o empréstimo terminou.
Por que funciona
O borrow checker permite múltiplos empréstimos imutáveis simultâneos. Como a função só lê a string, não há conflito. O empréstimo termina quando a função retorna, então o dono original pode ser usado novamente.
Erros comuns
- Esquecer o
&na chamada:primeira_palavra(texto)move aStringpara a função, e depoistextonão pode mais ser usado. O compilador acusa use of moved value. - Tentar modificar a string dentro da função: se você escrever
s.push('!')dentro deprimeira_palavra, o compilador reclama quesé imutável (cannot borrow as mutable). - Retornar uma referência para dados locais: se a função retornasse
&strapontando para um buffer local, o compilador acusaria missing lifetime specifier ou returns a value referencing data owned by the current function. Por isso criamos umaStringnova.
Outra forma de resolver
Usar &str em vez de &String é mais idiomático, pois aceita tanto String quanto literais:
fn primeira_palavra(s: &str) -> String {
s.split_whitespace().next().unwrap_or("").to_string()
}
Saída esperada
Primeira palavra: Rust
Texto completo: Rust é divertido