Rust中能否在模块文件内声明模块并使用简化路径引用?
问题解答
能不能在模块文件内声明模块同时使用简化引用路径?
可以,但你当前的写法造成了嵌套模块,才需要两层路径。问题出在你在src/hello.rs里写了pub mod hello { ... }——这相当于在crate::hello模块(由main.rs的mod hello;引入)内部又定义了一个同名子模块,所以函数路径变成了crate::hello::hello::do_hello。
要保持use crate::hello::{do_hello};的简化路径,有两种调整方式:
方式1:移除hello.rs内的嵌套模块声明
直接在src/hello.rs里写函数和必要的pub修饰,不要套一层pub mod hello:
// src/hello.rs pub fn do_hello() { println!("Hello!"); }
然后在main.rs里保留mod hello;,即可正常用use crate::hello::{do_hello};引用,这是最直接的方案。
方式2:用pub use重导出嵌套模块内容
如果必须在hello.rs里保留嵌套结构,可以在模块顶层重导出子模块的内容,把嵌套的符号“提升”到外层模块:
// src/hello.rs pub mod hello { pub fn do_hello() { println!("Hello!"); } } // 重导出子模块的所有内容到当前模块顶层 pub use hello::*;
这样main.rs里依然用mod hello;和use crate::hello::{do_hello};就能引用到函数。
Rust的惯用代码结构
对于这类简单二进制项目,惯用结构是:
- crate根模块为
src/main.rs,负责程序入口、调用核心逻辑 - 每个独立功能对应一个单独文件(如
src/hello.rs),复杂功能则用“目录+mod.rs”的结构 - 在根模块(main.rs)中用
mod 模块名;声明要引入的模块,模块文件内直接写该模块的内容(不嵌套同名模块) - 模块内需要对外暴露的函数、结构体等用
pub修饰,根模块通过use crate::模块名::{符号};引用
完整惯用示例:
// src/main.rs // 声明引入hello模块 mod hello; // 引用模块内的公开函数 use crate::hello::{do_hello}; fn main() { do_hello(); }
// src/hello.rs // 直接定义该模块的公开函数 pub fn do_hello() { println!("Hello from the hello module!"); }
如果hello模块逻辑复杂到需要拆分多个子模块,才会采用目录结构:
src/ ├── main.rs └── hello/ ├── mod.rs └── sub_module.rs
此时src/hello/mod.rs作为hello模块的入口,负责声明子模块并导出内容,main.rs依然用mod hello;引入整个模块。
内容的提问来源于stack exchange,提问作者M. Krajnak
相关产品推荐
相关产品推荐

