Проект ввода-вывода: создание программы командной строки
Эта глава — это повторение многих навыков, которые вы освоили, а также изучение некоторых дополнительных возможностей стандартной библиотеки. Мы создадим инструмент командной строки, который взаимодействует с файлами и вводом-выводом командной строки, чтобы потренировать концепции Rust, которые вы теперь знаете.
Примечание: в этой главе нет викторин, так как она представляет собой пошаговое практическое руководство.
Скорость, безопасность, вывод в виде одного бинарного файла и кроссплатформенная поддержка делают Rust идеальным языком для создания инструментов командной строки. Поэтому в нашем проекте мы создадим свою версию классического инструмента поиска в командной строке grep (globally search a regular expression and print — глобальный поиск по регулярному выражению с выводом). В простейшем случае grep ищет в указанном файле заданную строку. Для этого grep принимает в качестве аргументов путь к файлу и строку. Затем он читает файл, находит в нём строки, содержащие указанную строку, и выводит эти строки.
По ходу работы мы покажем, как заставить наш инструмент командной строки использовать возможности терминала, которые используют многие другие инструменты. Мы будем считывать значение переменной окружения, чтобы позволить пользователю настроить поведение нашего инструмента. Мы также будем выводить сообщения об ошибках в поток стандартной ошибки (stderr), а не в стандартный вывод (stdout). Это позволит, например, пользователю перенаправить успешный вывод в файл, продолжая видеть сообщения об ошибках на экране.
Один из участников сообщества Rust, Эндрю Галлант, уже создал полнофункциональную, очень быструю версию grep под названием ripgrep. В сравнении с ней наша версия будет довольно простой, но эта глава даст вам базовые знания, необходимые для понимания реального проекта, такого как ripgrep.
Наш проект grep объединит несколько концепций, которые вы уже изучили:
- Организация кода (Глава 7)
- Использование векторов и строк (Глава 8)
- Обработка ошибок (Глава 9)
- Использование типажей и времен жизни там, где это уместно (Глава 10)
- Написание тестов (Глава 11)
Мы также кратко познакомимся с замыканиями, итераторами и объектами типажей, которые будут подробно рассмотрены в Главе 13 и Главе 18.