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