rust用于从文件中查找模块的确切规则集是什么?
我在网上找到的每一个关于模块的解释都说;这就是模块的目的,这里有一个例子"没有一个能完整、全面、100%准确地解释铁锈如何查找模块。即使是rust引用也不会告诉您机箱根和导入文件是否都需要声明mod
!没有一个简单的规则集可以用来判断它是否有效。
我正在寻找我可以遵循的东西,比如:
- Rust查看名称,像解析
subdir::subdir::name
一样解析::
- Rust查看同一目录中是否有文件
name.rs
和name/mod.rs
- 不允许同时存在
name.rs
和name/mod.rs
- 那么,鲁斯特
最好从内联模块开始解释这一点。模块从机箱根开始排列成一个层次结构。每一个板条箱,经过一番翻新后,看起来都是这样的:
// 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
来自机箱中的任何位置- 来自模块
foo
的super::a::b::X
- 来自模块
a
的b::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.rs
和src/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
中的花哨配置,尽可能使用默认值