锈蚀是如何查找模块的



rust用于从文件中查找模块的确切规则集是什么?

我在网上找到的每一个关于模块的解释都说;这就是模块的目的,这里有一个例子"没有一个能完整、全面、100%准确地解释铁锈如何查找模块。即使是rust引用也不会告诉您机箱根和导入文件是否都需要声明mod!没有一个简单的规则集可以用来判断它是否有效。

我正在寻找可以遵循的东西,比如:

  1. Rust查看名称,像解析subdir::subdir::name一样解析::
  2. Rust查看同一目录中是否有文件name.rsname/mod.rs
  3. 不允许同时存在name.rsname/mod.rs
  4. 那么,鲁斯特

最好从内联模块开始解释这一点。模块从机箱根开始排列成一个层次结构。每一个板条箱,经过一番翻新后,看起来都是这样的:

// root
pub mod a {
pub mod b {
pub const X: u8 = 1;
}
}
mod foo {

}

引用树中的项目非常简单:

  • CCD_;向下";水平仪
  • CCD_ 9变为"0";向上";水平仪
  • crate::进入根级别

参考X:的示例

  • 板条箱根部的a::b::X
  • crate::a::b::X来自机箱中的任何位置
  • 来自模块foosuper::a::b::X
  • 来自模块ab::X

mod foo;实际上只是以下任一项的语法糖:

#[path = "foo.rs"]
mod foo;
// or
#[path = "foo/mod.rs"]
mod foo;

哪个进一步减温到:

mod foo {
include!("foo.rs");
}
// or
mod foo {
include!("foo/mod.rs");
}

如果foo.rs(或foo/mod.rs(包含一个mod bar;,那么整个树看起来像:

mod foo {
mod bar {
// contents of `bar.rs` (or `foo/bar/mod.rs`)
}
// remaining contents of `foo.rs`
}

请注意,虽然mod.rs仍受支持,但不鼓励使用。相反,建议将foo.rs用于crate::foo,并将foo的任何子模块放置在foo/目录中。

如果src/foo/mod.rssrc/foo.rs都存在,编译器将抛出以下错误:

error[E0761]: file for module `foo` found at both "srcfoo.rs" and "srcfoomod.rs"
--> srcmain.rs:1:1
|
1 | mod foo;
| ^^^^^^^^
|
= help: delete or rename one of them to remove the ambiguity

CCD_ 29总是对应于当时正在编译的机箱的根模块。如果你的板条箱足够复杂或不符合惯例,那么某些crate::...项目路径可以引用不同文件中的不同内容。但是,遵循惯例很容易避免混淆。

以下是我用来避免混淆的惯例列表:

  • 避免#[path]属性
  • 始终使用src/foo.rs而不是src/foo/mod.rs
  • 如果您有多个根模块(例如一个库和二进制机箱(,它们都应该直接存在于src
  • 尽量减少Cargo.toml中的花哨配置,尽可能使用默认值

最新更新