Um projeto de E/S: Criando um Programa de Linha de Comando
Este capítulo é um recapitulação de muitas habilidades que você aprendeu até agora e uma exploração de mais alguns recursos da biblioteca padrão. Vamos construir uma ferramenta que interage com arquivo de entrada/saída em linha de comando para praticar alguns dos conceitos de Rust que você tem a disposição.
A velocidade, a segurança, a saída binary-único e o suporte multi-plataforma de Rust
fazem dela uma linguagem ideal para a criação de ferramentas de linha de comando. Assim,
para nosso projeto, criaremos nossa própria versão da ferramenta clássica de linha de comando grep
(globally search a regular expression and print). No caso de uso mais simples,
o grep
procura um arquivo especificado para uma string especificada. Para fazer isso, o grep
toma como argumento um nome de arquivo e uma string, e então lê o arquivo e localiza linhas naquele
arquivo que contém o argumento string. Em seguida, imprime essas linhas.
Ao longo do caminho, mostraremos como fazer com que nossa ferramenta de linha de comando use recursos do
terminal que muitas ferramentas de linha de comando usam. Leremos o valor de uma
variável de ambiente para permitir ao usuário configurar o comportamento de nossa ferramenta.
Também imprimiremos na saída de console de erro padrão (stderr
) em vez da
saída padrão (stdout
), por exemplo, o usuário pode redirecionar saída de sucesso
para um arquivo enquanto ainda está vendo mensagens de erro na tela.
Um membro da comunidade One Rust, Andrew Gallant, já criou uma versão completa
, e muito rápida do grep
, chamada ripgrep
. Em comparação, nossa
versão do grep
será bastante simples, mas este capítulo lhe dará alguns dos
conhecimento básicos que você precisa para entender um projeto real como
ripgrep
.
Nosso projeto grep
combinará uma série de conceitos que você aprendeu até agora:
- Organizar código (usando o que aprendeu em módulos, Capítulo 7)
- Usando vetores e strings (coleções, Capítulo 8)
- Erros de manipulação (Capítulo 9)
- Usando traits e lifetimes, quando apropriado (Capítulo 10)
- Escrevendo testes (Capítulo 11)
Também apresentamos brevemente closures, iterações e trait objects, que os capítulos 13 e 17 abordarão em detalhes.