Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

パッケージ、クレート、モジュール

大規模なプログラムを書くようになると、コードを整理することの重要性はますます高まります。関連する機能をグループ化し、異なる機能ごとにコードを分けることで、特定の機能を実装しているコードがどこにあるのか、またその機能の動作を変更するにはどこを見ればよいのかが明確になります。

これまでに書いてきたプログラムは、1つのファイル内の1つのモジュールに収まっていました。プロジェクトが大きくなるにつれて、コードを複数のモジュールに分け、さらに複数のファイルに分割して整理すべきです。パッケージには複数のバイナリクレートと、必要に応じて1つのライブラリクレートを含めることができます。パッケージが成長するにつれて、その一部を外部依存関係となる別個のクレートに切り出すことができます。この章では、これらすべての手法を扱います。相互に関連し、ともに進化していく一連のパッケージから構成される非常に大規模なプロジェクト向けに、Cargo はワークスペースを提供しています。これについては、第14章の「Cargo Workspaces」で扱います。

また、実装の詳細をカプセル化することについても説明します。これにより、より高いレベルでコードを再利用できるようになります。いったんある操作を実装すれば、他のコードは、その実装がどのように動作するかを知らなくても、その公開インターフェースを通じてあなたのコードを呼び出せます。コードの書き方によって、他のコードが利用するために公開される部分と、変更する権利を保持する非公開の実装詳細となる部分が定義されます。これも、頭の中で保持しておかなければならない詳細の量を減らすための別の方法です。

関連する概念にスコープがあります。コードが書かれる入れ子になったコンテキストには、「スコープ内」と定義される名前の集合があります。コードを読んだり、書いたり、コンパイルしたりするとき、プログラマとコンパイラは、ある場所にある特定の名前が、変数、関数、構造体、列挙型、モジュール、定数、その他の項目のどれを指しているのか、そしてその項目が何を意味するのかを知る必要があります。スコープを作成し、どの名前がスコープ内にあるか、あるいはスコープ外にあるかを変更できます。同じスコープ内に同じ名前の項目を2つ持つことはできません。名前の衝突を解決するためのツールも用意されています。

Rust には、どの詳細を公開し、どの詳細を非公開にし、プログラム内の各スコープにどの名前を含めるかを含め、コードの構成を管理するための多くの機能があります。これらの機能は、ときにまとめて モジュールシステム と呼ばれ、次のものを含みます。

  • パッケージ: クレートをビルド、テスト、共有できる Cargo の機能
  • クレート: ライブラリまたは実行可能ファイルを生成するモジュールツリー
  • モジュールと use: パスの構成、スコープ、可視性を制御するためのもの
  • パス: 構造体、関数、モジュールなどの項目に名前を付ける方法

この章では、これらの機能をすべて取り上げ、それらがどのように相互作用するのかを説明し、スコープを管理するためにそれらをどう使うかを解説します。読み終える頃には、モジュールシステムをしっかり理解し、スコープを使いこなせるようになっているはずです!