Проєкт I/O: Створення програми командного рядка
Цей розділ — це підсумок багатьох навичок, які ви опанували досі, і дослідження ще кількох можливостей стандартної бібліотеки. Ми побудуємо інструмент командного рядка , що взаємодіє з введенням/виведенням файлів і командного рядка, щоб попрактикуватися в деяких із концепцій 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 розглянуть детально.