rust mod语句的不一致

时间:2019-04-14 09:07:22

标签: rust

以下示例通过以下链接将模块分为不同的文件: 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:子目录

1 个答案:

答案 0 :(得分:3)

在标准的Rust bin项目中,src/main.rs被指定为板条箱根。 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/中,它将被视为包装箱中的顶层模块。