You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
}

可以实现,核心是将子模块内的函数重导出到父模块的根作用域:

  1. 修改level1/mod.rs,将原来的pub mod sign;替换为(或追加):
pub mod sign;
pub use sign::sign; // 将sign模块中的sign函数重导出到level1模块
  1. 对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 20:35:05