生锈mod语句的不一致

问题描述 投票:0回答:1

按照以下链接将模块分成不同文件的示例:https://doc.rust-lang.org/book/ch07-02-modules-and-use-to-control-scope-and-privacy.html#separating-modules-into-different-files

我在src目录下创建了以下文件:

├── main.rs
├── sound
│   └── instrument.rs
└── sound.rs

src/main.rs

mod sound;

fn main() {
  // Absolute path
  crate::sound::instrument::clarinet();

  // Relative path
  sound::instrument::clarinet();
}

src/sound.rs

pub mod instrument;

src/sound/instrument.rs

pub fn clarinet() {
  println!("clarinet");
}

该示例按预期编译和工作。现在我的问题是:为什么在main.rs,它可以从同一目录“修改”sound.rs,而在sound.rs,它必须从子目录“修改”instrument.rs

rust
1个回答
3
投票

在标准的Rust bin项目中,src/main.rs被赋予特殊位置作为crate root。 src/中的其他源文件是包装箱顶层的模块。具有多个文件的模块可以采用两种形式之一。旧的方式是这样的:

├── main.rs
└── mod_name
    └── mod.rs
    └── submodule.rs
└── some_other_mod.rs

mod.rs是必需的(具有确切的名称),并将作为模块的顶级。在这种情况下,你可以看到,我敢肯定,src/mod_name/mod.rs直接引用some_other_mod而不用super::crate::作为前缀是没有意义的。

您正在使用的新方法允许您放弃mod.rs并在父mod目录中使用mod_name.rs,其目的与mod.rs相同。当您开始将库作为单个文件开发时,这很方便,然后当您决定添加更多文件时,您不需要重命名和移动顶级文件。

在您的情况下,instrument.rs需要位于sound/目录中才能被视为sound模块的一部分。如果您将它直接放在src/中,它将被视为包装箱中的顶级模块。

© www.soinside.com 2019 - 2024. All rights reserved.