Rust项目结构与模块使用问题咨询(C++转Rust背景)
Rust模块与命名空间相关问题解答
场景说明
我有一个Rust crate,具备C++开发背景,想找到类似namespace的概念。当前项目文件结构如下:
src | |--lib.rs | |--examples/example.rs | |--level1 | |---verify.rs // pub fn verify(...) | |---keygen.rs // pub fn gen_key(...) | |---sign.rs // pub fn sign(...) | |---mod.rs // pub mod verify; pub mod keygen; pub mod sign; | |--level2 | |---verify.rs // pub fn verify(...) | |---keygen.rs // pub fn gen_key(...) | |---sign.rs // pub fn sign(...) | |---mod.rs // pub mod verify; pub mod keygen; pub mod sign;
目前调用函数的方式是:
// examples/example1.rs use crate_name::*; fn main() { crate_name::level1::sign::sign(); crate_name::level2::sign::sign(); }
问题1:是否可以简化为如下调用方式?若可以,如何实现?
[...] fn main() { crate_name::level1::sign(); crate_name::level2::sign(); }
可以实现,核心是将子模块内的函数重导出到父模块的根作用域:
- 修改
level1/mod.rs,将原来的pub mod sign;替换为(或追加):
pub mod sign; pub use sign::sign; // 将sign模块中的sign函数重导出到level1模块
- 对
level2/mod.rs执行同样的修改:
pub mod sign; pub use sign::sign;
修改后,sign函数就直接属于level1和level2模块的公共接口,即可通过crate_name::level1::sign()的方式调用。如果不需要保留level1::sign子模块,也可以只保留pub use sign::sign;并删除pub mod sign;,但通常建议保留子模块以维持结构完整性。
问题2:像level1这类文件夹在Rust中的术语是什么?它们既不是crate也不是模块?
这类包含mod.rs的文件夹是模块目录(module directory),它是Rust组织模块的物理形式:这个文件夹对应的就是mod.rs所定义的逻辑模块(即level1模块),里面的.rs文件则是该模块的子模块。它并非“既不是crate也不是模块”,而是模块的载体,对应的逻辑实体就是level1模块。
问题3:像level1/sign.rs这类文件对应模块,是否默认以文件名作为模块名,同一文件内可通过mod tests{}定义其他模块?我的理解是否正确?
你的理解完全正确:
- Rust中,文件名
sign.rs对应的模块名默认就是sign,需要在父模块(level1/mod.rs)中通过pub mod sign;声明这个子模块。 - 在同一
.rs文件内,通过mod tests {}定义的是当前模块的子模块,这类子模块通常用于编写单元测试,默认是私有模块,仅在当前文件内可见。
内容的提问来源于stack exchange,提问作者radix
相关产品推荐
相关产品推荐

