Exercício 1
Meça o char: code point e bytes em UTF-8
stub.rs
// char_info devolve (code point Unicode, bytes que o símbolo ocupa em UTF-8).
// Exemplo: 'ç' é o code point 231 e ocupa 2 bytes quando codificado.
pub fn char_info(symbol: char) -> (u32, usize) {
// implemente:
let _ = symbol;
(0, 0)
}
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: [(char, u32, usize); 4] = [
('A', 65, 1),
('ç', 231, 2),
('日', 26085, 3),
('🦀', 129408, 4),
];
for (index, (symbol, want_point, want_bytes)) in cases.iter().enumerate() {
let (point, bytes) = char_info(*symbol);
let pass = point == *want_point && bytes == *want_bytes;
print_result(
index + 1,
pass,
&format!("{symbol:?}"),
&format!("({want_point}, {want_bytes})"),
&format!("({point}, {bytes})"),
);
}
}
cases.json
[
{
"case": 1,
"input": "'A'",
"want": "(65, 1)"
},
{
"case": 2,
"input": "'ç'",
"want": "(231, 2)"
},
{
"case": 3,
"input": "'日'",
"want": "(26085, 3)"
},
{
"case": 4,
"input": "'🦀'",
"want": "(129408, 4)"
}
]
Casos e valores esperados
| Caso | Entrada | Valor esperado |
|---|---|---|
| 1 | 'A' |
(65, 1) |
| 2 | 'ç' |
(231, 2) |
| 3 | '日' |
(26085, 3) |
| 4 | '🦀' |
(129408, 4) |
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-03-variaveis-e-tipos-exercicio-1
cd imersao-03-variaveis-e-tipos-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-03-variaveis-e-tipos-exercicio-1
cargo clippy -- -D warnings
Mostrar dicas
- Um char sempre cabe em u32 — a conversão explícita com `as` extrai o code point; o método len_utf8 diz quantos bytes ele ocupa quando codificado.
- Devolva a tupla (symbol as u32, symbol.len_utf8()) — os dois valores saem direto do char, sem condição nenhuma.
Revelar solução
solution.rs
// char_info devolve (code point Unicode, bytes que o símbolo ocupa em UTF-8).
// Exemplo: 'ç' é o code point 231 e ocupa 2 bytes quando codificado.
pub fn char_info(symbol: char) -> (u32, usize) {
(symbol as u32, symbol.len_utf8())
}
O char guarda o code point Unicode em 4 bytes fixos na memória; `as u32` lê esse número e len_utf8 calcula o tamanho variável na codificação. A armadilha é confundir os dois: 'ç' é o code point 231, mas ocupa 2 bytes em UTF-8, não 4.