Introdução
Rust usa String para texto de propriedade do programa e que pode crescer, e &str para uma visão emprestada do texto. Um string slice pode visualizar uma string inteira ou um intervalo selecionado de bytes sem copiar os caracteres.
Você passará um texto proprietário para uma função que recebe &str por empréstimo, criará uma palavra-chave de comando emprestada e solicitará intencionalmente que o compilador indexe um texto UTF-8 de uma forma não suportada, antes de corrigir o código usando um slice que respeita os limites válidos.
Empreste texto proprietário e literal como &str
Nesta etapa, você passará duas fontes de texto diferentes para uma função que aceita um string slice emprestado.
Entre no projeto preparado e abra o código-fonte:
cd /home/labex/project/string-slices
nano src/main.rs
O tipo String é proprietário de um texto que pode crescer. O tipo &str, pronunciado “string slice”, é uma visão emprestada de um texto UTF-8 válido. Um literal de string, como "preview", já tem um tipo string slice emprestado porque o programa armazena esse texto durante toda a execução.
A função show_text(label: &str) pode visualizar os dois tipos de texto. Substitua somente /* Step 1: borrow command */ por &command:
show_text(&command);
O Rust trata automaticamente o &String emprestado como a visão &str solicitada pela função. Essa conversão não copia nem move os caracteres.
Salve com Ctrl+O, pressione Enter e saia com Ctrl+X. Execute o programa:
cargo run --quiet
A saída deve ser:
Text: serve reports
Text: preview
Keyword: <>
Status: ✅ ready
As duas chamadas chegam ao mesmo parâmetro &str. A palavra-chave vazia é um marcador preparado para a próxima etapa.
Empreste uma substring sem copiá-la
Nesta etapa, você fará com que keyword visualize somente o prefixo serve dentro de command.
Abra o código-fonte:
nano src/main.rs
A forma de slice &text[start..end] empresta um intervalo. O início é incluído e o fim é excluído. Os intervalos de strings em Rust contam bytes, e cada letra ASCII de serve ocupa um byte; portanto, o intervalo começa no byte 0 e termina antes do byte 5.
Substitua somente o literal vazio "" na linha da Etapa 2 por &command[0..5]:
let keyword = &command[0..5]; // Step 2: replace the empty slice.
O &str resultante aponta para uma parte de command; ele não aloca nem copia uma segunda string. Como command continua no escopo, a visão emprestada permanece válida enquanto keyword é usado.
Salve e saia, depois execute:
cargo run --quiet
A última linha agora deve ser:
Keyword: <serve>
O command proprietário ainda contém o texto completo serve reports, enquanto keyword é apenas uma janela emprestada para seus cinco primeiros bytes.
Respeite os limites de caracteres UTF-8
Nesta etapa, você tentará intencionalmente fazer uma indexação por inteiro, lerá a explicação do compilador e a substituirá por um slice UTF-8 válido.
Os caracteres UTF-8 não ocupam todos um único byte. Em "✅ ready", o símbolo de marca de verificação usa três bytes. Portanto, o byte zero não é automaticamente “o primeiro caractere”, e o Rust não permite status[0] em uma String.
Abra o arquivo e remova somente o // inicial da linha de impressão da Etapa 3:
nano src/main.rs
Salve e saia, depois execute a verificação. A falha é esperada:
cargo check
Localize a mensagem estável:
error[E0277]: the type `str` cannot be indexed by `{integer}`
Esse diagnóstico impede que você suponha que todos os caracteres tenham uma posição de um byte. Abra o arquivo novamente e substitua a linha de impressão que falha por estas duas linhas curtas:
let symbol = &status[0..3];
println!("Status symbol: {symbol}");
O intervalo 0..3 termina exatamente depois do símbolo de três bytes. Isso funciona porque o texto preparado e seu limite de bytes são conhecidos antecipadamente; não é uma receita geral para encontrar o primeiro caractere visível para uma pessoa em um texto arbitrário. Um intervalo que atravesse o meio de um caractere UTF-8 causaria um panic em tempo de execução; portanto, os intervalos de strings devem usar limites UTF-8 válidos e conhecidos.
Salve e saia, depois verifique e execute:
cargo check
cargo run --quiet
A saída completa deve ser:
Text: serve reports
Text: preview
Keyword: <serve>
Status: ✅ ready
Status symbol: ✅
A saída bem-sucedida comprova que o slice final seleciona um caractere UTF-8 completo sem copiar a String original.
Resumo
Você relacionou valores String proprietários a visões &str emprestadas, selecionou uma substring sem alocação e aprendeu por que o texto UTF-8 não pode ser tratado como um array de caracteres indexado por bytes. Os intervalos seguros de strings devem começar e terminar em limites UTF-8 válidos.


