Проект с вводом/выводом (I/O): создание консольного приложения

В этой главе вы примените многие знания, полученные ранее, а также познакомитесь с ещё не изученными API стандартной библиотеки. Мы создадим инструмент командной строки, который взаимодействует файлом и с вводом / выводом командной строки, чтобы попрактиковаться в некоторых концепциях Rust, с которые вы уже знакомы.

Скорость, безопасность, компиляция в один исполняемый файл и кроссплатформенность делают Rust идеальным языком для создания инструментов командной строки, так что в нашем проекте мы создадим свою собственную версию классической утилиты grep, что расшифровывается, как "глобальное средство поиска и печати" (globally search a regular expression and print). В простейшем случае grep используется для поиска в указанном файле указанного текста. Для этого утилита grep получает имя файла и текст в качестве аргументов. Далее она читает файл, находит и выводит строки, содержащие искомый текст.

По пути мы покажем, как сделать так, чтобы наш инструмент использовал возможности терминала, которые используются многими инструментами командной строки. Мы будем читать значение переменной окружения, чтобы позволить пользователю настроить поведение нашего инструмента. Мы также будем печатать сообщения об ошибках в стандартный консольный поток ошибок ( stderr ) вместо стандартного вывода ( stdout ), чтобы, к примеру, пользователь мог перенаправить успешный вывод в файл, в то время, как сообщения об ошибках останутся на экране.

Один из участников Rust-сообщества, Andrew Gallant уже реализовал полнофункциональный, очень быстрый аналог программы grep и назвал его ripgrep. Создаваемая нами версия grep будет, конечно, намного проще, но эта глава даст вам знания, необходимые для понимания этапов создания реальных проектов, таких как ripgrep.

Наш проект grep будет использовать ранее изученные концепции:

  • Организация кода (используя то, что вы узнали о модулях в главе 7)
  • Использование векторов и строк (коллекции, глава 8)
  • Обработка ошибок (Глава 9)
  • Использование типажей и времени жизни там, где это необходимо (глава 10)
  • Написание тестов ( Глава 11)

Мы также кратко представим замыкания, итераторы и объекты типажи, которые будут объяснены подробно в главах 13 и 17.