Rust 2018模块系统:深层目录文件引入冗余写法优化咨询
问题:优化Rust深层目录模块引入的冗余写法
作为Rust新手,正在学习模块系统,由于Rust 2018版本的模块系统变更,看教程时感到困惑,也没找到深层目录文件引入的相关说明。现有一个可运行项目,但当前引入两层子目录文件的写法过于冗长,希望优化。
项目文件结构
. |-- Cargo.toml `-- src |-- cmds | |-- install_cmd | | |-- install.rs | | `-- ... | `-- start_cmd | |-- start.rs | `-- ... `-- main.rs
子文件内容示例(start.rs结构类似)
pub fn handle_install_command() { // ... 具体逻辑 }
当前main.rs中的冗余写法
mod cmds { pub mod install_cmd { pub mod install; } pub mod start_cmd { pub mod start; } } use cmds::{install_cmd::install::handle_install_command, start_cmd::start::handle_start_command}; fn main() { handle_install_command(); handle_start_command(); }
希望找到无需编写大量模板化mod声明的方式,既不想用多个mod文件,也不想在根目录文件里写过多冗余代码。
优化方案
利用mod.rs分层管理模块声明
Rust 2018版本支持通过目录下的mod.rs文件拆分模块声明,彻底避免在main.rs中嵌套多层mod:
在
src/cmds目录下创建mod.rs
声明下一级的install_cmd和start_cmd模块:pub mod install_cmd; pub mod start_cmd;在
src/cmds/install_cmd目录下创建mod.rs
声明该目录下的install模块:pub mod install;在
src/cmds/start_cmd目录下创建mod.rs
声明该目录下的start模块:pub mod start;简化main.rs中的代码
只需声明顶层的cmds模块,就能自动识别下层的模块结构:mod cmds; use cmds::install_cmd::install::handle_install_command; use cmds::start_cmd::start::handle_start_command; fn main() { handle_install_command(); handle_start_command(); }
进一步简化use语句(可选)
如果觉得use路径仍过长,可以在各层mod.rs中导出目标函数,实现更短的引用路径:
- 在
src/cmds/install_cmd/mod.rs中导出函数:pub mod install; pub use install::handle_install_command; - 在
src/cmds/start_cmd/mod.rs中做同样操作:pub mod start; pub use start::handle_start_command; - 在
src/cmds/mod.rs中再次导出:pub mod install_cmd; pub use install_cmd::handle_install_command; pub mod start_cmd; pub use start_cmd::handle_start_command;
此时main.rs的use语句可简化为:
mod cmds; use cmds::{handle_install_command, handle_start_command}; fn main() { handle_install_command(); handle_start_command(); }
核心原理
Rust中目录与模块一一对应:
- 一个目录对应一个模块,目录下的
mod.rs是该模块的入口文件 - 目录下的
.rs文件或子目录,可通过mod声明成为当前模块的子模块
这种方式让模块结构与文件系统结构完全对齐,彻底消除顶层文件的冗余mod嵌套代码。
内容的提问来源于stack exchange,提问作者iuiz
相关产品推荐
相关产品推荐

