ファイルシステム階層

モジュールの内容を省略すると、Rust はそれを別のファイル内で探します:

// Copyright 2022 Google LLC
// SPDX-License-Identifier: Apache-2.0

mod garden;

これにより、garden モジュールの内容が src/garden.rs にあることを Rust に伝えます。 同様に、garden::vegetables モジュールは src/garden/vegetables.rs にあります。

crate ルートは次の場所にあります:

  • src/lib.rs(ライブラリ crate の場合)
  • src/main.rs(バイナリ crate の場合)

ファイル内で定義されたモジュールも、「内部ドキュメントコメント」を使って文書化できます。 これらは、それを含むアイテムを文書化します。この場合はモジュールです。

// Copyright 2022 Google LLC
// SPDX-License-Identifier: Apache-2.0

//! このモジュールは garden を実装しており、高性能な発芽実装を含みます。

// このモジュールから型を再エクスポートします。
pub use garden::Garden;
pub use seeds::SeedPacket;

/// 指定された seed packet をまきます。
pub fn sow(seeds: Vec<SeedPacket>) {
    todo!()
}

/// 準備ができている garden 内の収穫物を収穫します。
pub fn harvest(garden: &mut Garden) {
    todo!()
}
  • Rust 2018 より前は、モジュールは module.rs ではなく module/mod.rs に配置する必要がありました。これは 2018 以降の edition でも引き続き有効な代替手段です。

  • filename/mod.rs の代わりに filename.rs が導入された主な理由は、mod.rs という名前のファイルが多数あると、IDE で区別しにくくなるためです。

  • メインモジュールがファイルであっても、より深いネストではフォルダーを使用できます:

    src/
    ├── main.rs
    ├── top_module.rs
    └── top_module/
        └── sub_module.rs
    
  • Rust がモジュールを探す場所は、コンパイラディレクティブで変更できます:

    // Copyright 2022 Google LLC
    // SPDX-License-Identifier: Apache-2.0
    
    #[path = "some/path.rs"]
    mod some_module;

    これは、たとえば Go の慣習に似せて、モジュールのテストを some_module_test.rs という名前のファイルに配置したい場合に便利です。