パッケージ#
パッケージは 1 つまたは複数のクレートから構成される集合です。Cargo プロジェクトはパッケージです。
パッケージには 1 つ以上のバイナリアイテムを含めることができますが、ライブラリは 1 つしか含めることができません。これはなぜですか?公開するためですか。他のバイナリアイテムを作成するには、ファイルをsrc/bin
ディレクトリに配置するだけで、独立したバイナリファイルとしてコンパイルされます。
クレート#
クレートはバイナリアイテムとライブラリに分けられます。Cargo が作成するデフォルトのテンプレートには、バイナリアイテムが 1 つだけ含まれています。src/main.rs
がエントリーポイントのルートファイルであることが規定されています。Cargo はまた、src/lib.rs
をライブラリのルートファイルとして規定しています。
クレートのコンパイルは、必要なコードをルートファイルから探索して行います。
モジュール#
モジュールはクレートのコードをグループ化するために使用され、モジュール内のコードはデフォルトで非公開です。
mod web {
mod client {
mod home {}
fn get_env() {}
}
mod server {
struct DTO {
id: String
}
}
}
パス#
- 絶対パスは、クレート名(同じクレートでは
crate
を使用)で始まるフルパスです。 - 相対パスは、現在のモジュールから
self
、super
、およびモジュール名を使用して位置を特定するパスです。
use#
use
キーワードを使用してアクセス可能なモジュールをインポートし、そのモジュールのスコープの内容を直接使用することができます。これは JS のimport
と似ています。
- 関数のインポートに関しては、通常は親モジュールをインポートし、呼び出し時に指定することが一般的です。これは
call(this)
のような感覚です。 - 構造体や列挙型などに関しては、完全なパスを参照し、直接使用することが一般的です。
use web::client;
use web::server::DTO;
client.get_env();
DTO {
id: String::from(""),
};
// 再エクスポート
pub use web::server;
// ネストしたインポート
use web::{self, server::DTO};
// webのすべての公開サブモジュールをインポート
use web::*;
モジュールファイル#
大きなモジュールを複数のファイルに分割することは、読みやすさに役立ちます。これはフロントエンドのモジュール化の考え方と一致しています。
web
├── client
│ └── home.rs
└── server.rs