Modules

参考资料: https://doc.rust-lang.org/reference/items/modules.html

1
2
3
4
5
6
7
Syntax:
Module :
unsafe? mod IDENTIFIER ;
| unsafe? mod IDENTIFIER {
InnerAttribute*
Item*
}

module和类型享有相同的命名空间, 不能出现重名的现象. unsafe关键词在rust很多地方都可以用, 其详细作用留待后续补充.
一个module通常由花括号的内容进行定义, 如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

#![allow(unused)]
fn main() {
mod math {
type Complex = (f64, f64);
fn sin(f: f64) -> f64 {
/* ... */
unimplemented!();
}
fn cos(f: f64) -> f64 {
/* ... */
unimplemented!();
}
fn tan(f: f64) -> f64 {
/* ... */
unimplemented!();
}
}
}

1. Module Source Filenames

上面是一种mod关键词的使用, 另一种是声明一个module, 但是不具备主体. 如:

1
mod rvmm;

这类module的主体是从文件中加载的. 当mod语句没有path属性时, module文件的路径会根据module的名称进行推理, 见下表, 这样就能组织起module的树形结构了

Module PathFile PathContents
cratelib.rsmod util;
crate::utilutil.rsmod config;
crate::util::configutil/config.rs

事实上, module对应的名字也可以是一个文件夹, 只要该文件夹下有mod.rs.

注意, 使用mod语句, 只是将一个module添加到module分支树的当前节点上, 还需要用use语句进行导入~

1
2
mod vmm_action;
pub use self::vmm_action::*;

2. The path attribute

有时候, module的名字必须与文件或者文件夹绑定过于死板, 因此可以指定path属性, 单独设置. 这时又存在两种情况:

1
2
#[path = "foo.rs"]
mod c;
Source Filec's File Locationc's Module Path
src/a/b.rssrc/a/foo.rscrate::a::b::c
src/a/mod.rssrc/a/foo.rscrate::a::c
1
2
3
4
mod inline {
#[path = "other.rs"]
mod inner;
}
Source Fileinner's File Locationinner's Module Path
src/a/b.rssrc/a/b/inline/other.rscrate::a::b::inline::inner
src/a/mod.rssrc/a/inline/other.rscrate::a::inline::inner

mod-rs指的是根模块(例如lib.rs或者main.rs)和mod.rs (用来将目录作为module)

对于第一种情况, path属性的设置在inline module之外, 指定的文件的相对路径是相对于当前源文件所在目录. 注意源文件是mod-rs还是non-mod-rs其在module tree中的位置不一样~ 可以对比第一个表来判断

对于第二种情况, 也分为mod-rsnon-mod-rs两种情况, 其实本质差不多, 最终归结为module的定义形式


Modules
https://www.torch-fan.site/2022/07/21/modules/
作者
Torch-Fan
发布于
2022年7月21日
更新于
2022年11月15日
许可协议