I/Oプロジェクト: コマンドラインプログラムを構築する
この章では、これまでに学んだ多くのスキルを振り返るとともに、 標準ライブラリのいくつかの追加機能を探ります。ファイルおよび コマンドラインの入出力とやり取りするコマンドラインツールを構築して、 これまでに身につけたRustの概念をいくつか実践していきます。
Rustの速度、安全性、単一バイナリを出力できること、そして
クロスプラットフォーム対応により、Rustはコマンドラインツールを作成する
うえで理想的な言語です。そこでこのプロジェクトでは、古典的な
コマンドライン検索ツール grep(globally search a regular
expression and print)の独自版を作ります。もっとも単純な
ユースケースでは、grep は指定されたファイルから指定された文字列を
検索します。そのために、grep は引数としてファイルパスと文字列を
受け取ります。次に、ファイルを読み込み、その文字列引数を含む行を
見つけ、それらの行を出力します。
その過程で、多くのコマンドラインツールが利用しているターミナル機能を、
私たちのコマンドラインツールでも使う方法を示します。環境変数の値を
読み取って、ユーザーがツールの動作を設定できるようにします。また、
エラーメッセージを標準出力 (stdout) ではなく標準エラーストリーム
(stderr) に出力することで、たとえば正常な出力をファイルに
リダイレクトしつつ、エラーメッセージは引き続き画面上で確認できるように
します。
Rustコミュニティの一員であるAndrew Gallantは、ripgrep と呼ばれる、
高機能で非常に高速な grep の実装をすでに作成しています。これに
比べると、私たちの版はかなり単純なものになりますが、この章では
ripgrep のような実世界のプロジェクトを理解するために必要な背景知識を
いくつか身につけられます。
私たちの grep プロジェクトでは、これまでに学んださまざまな概念を
組み合わせます。
また、クロージャ、イテレータ、トレイトオブジェクトについても簡単に 紹介します。これらについては、第13章 と 第18章 で詳しく扱います。