Exercício 1
Monte a saudação com format!
stub.rs
// greeting devolve a mensagem "Olá, {name}! Bem-vindo ao Rust." com o nome
// interpolado — pontuação e espaços exatamente como no molde.
pub fn greeting(name: &str) -> String {
// implemente:
String::from(name)
}
harness.rs
fn json_escape(value: &str) -> String {
value
.replace('\\', "\\\\")
.replace('"', "\\\"")
.replace('\n', "\\n")
}
fn print_result(case: usize, pass: bool, input: &str, want: &str, got: &str) {
println!(
"RESULT {{\"case\":{case},\"pass\":{pass},\"input\":\"{}\",\"want\":\"{}\",\"got\":\"{}\"}}",
json_escape(input),
json_escape(want),
json_escape(got)
);
}
fn main() {
let cases = [
("Ana", "Olá, Ana! Bem-vindo ao Rust."),
("dev", "Olá, dev! Bem-vindo ao Rust."),
("", "Olá, ! Bem-vindo ao Rust."),
("João da Silva", "Olá, João da Silva! Bem-vindo ao Rust."),
];
for (index, (name, want)) in cases.iter().enumerate() {
let got = greeting(name);
let pass = got == *want;
print_result(index + 1, pass, &format!("{name:?}"), want, &got);
}
}
cases.json
[
{
"case": 1,
"input": "\"Ana\"",
"want": "Olá, Ana! Bem-vindo ao Rust."
},
{
"case": 2,
"input": "\"dev\"",
"want": "Olá, dev! Bem-vindo ao Rust."
},
{
"case": 3,
"input": "\"\"",
"want": "Olá, ! Bem-vindo ao Rust."
},
{
"case": 4,
"input": "\"João da Silva\"",
"want": "Olá, João da Silva! Bem-vindo ao Rust."
}
]
Casos e valores esperados
| Caso | Entrada | Valor esperado |
|---|---|---|
| 1 | "Ana" |
Olá, Ana! Bem-vindo ao Rust. |
| 2 | "dev" |
Olá, dev! Bem-vindo ao Rust. |
| 3 | "" |
Olá, ! Bem-vindo ao Rust. |
| 4 | "João da Silva" |
Olá, João da Silva! Bem-vindo ao Rust. |
Execute com o Cargo local
- Execute os comandos de preparação.
- Copie os arquivos acima para os arquivos vazios com os mesmos nomes.
- Execute a verificação de base. O stub deve mostrar o comportamento atual.
Comandos de preparação
cargo new --bin --edition 2024 imersao-01-bem-vindo-ao-rust-exercicio-1
cd imersao-01-bem-vindo-ao-rust-exercicio-1
touch stub.rs harness.rs cases.json
printf 'include!("../stub.rs");\ninclude!("../harness.rs");\n' > src/main.rs
Verificação de base — confirme o comportamento atual antes da mudança
cargo fmt --check
cargo run --bin imersao-01-bem-vindo-ao-rust-exercicio-1
cargo clippy -- -D warnings
Mostrar dicas
- A mensagem é sempre a mesma frase com o nome no meio; a macro format! monta uma String nova a partir de um molde com chaves.
- format!("Olá, {name}! Bem-vindo ao Rust.") interpola a variável direto no molde — confira a pontuação exata, os casos comparam byte a byte.
Revelar solução
solution.rs
// greeting devolve a mensagem "Olá, {name}! Bem-vindo ao Rust." com o nome
// interpolado — pontuação e espaços exatamente como no molde.
pub fn greeting(name: &str) -> String {
format!("Olá, {name}! Bem-vindo ao Rust.")
}
format! devolve uma String alocada com o texto interpolado; a armadilha é errar a pontuação exata ou tentar concatenar &str com +, que exige uma String à esquerda e confunde quem está começando.