仅讨论在一个 crate 内部的模块该如何组织,Rust的模块不像java,不强制目录映射,首次学习是懵的状态,官方的书解释的也不直观。
这里用两个模块做下解释 整体模块关系如下,这个图是用这个工具生成的 cargo-modules,命令:cargo-modules generate tree
对应文件目录结构
关键文件是这几个 mod.rs 文件
先来看下 main.rs
mod user_module;
mod pay_module;
#[warn(dead_code)]
fn main() {
println!("Hello, world!");
user_module::api::query_user_api();
println!("-------");
let goods_order = pay_module::models::GoodsOrder{
amount: String::from("10"),
note: String::from("note"),
};
pay_module::api::order_pay(goods_order)
}
接着是 user_module 中的文件 user_module/mod.rs
pub mod api;
pub mod service;
pub mod mapper;
user_module/api.rs
use super::service;
pub fn query_user_api() {
service::query_user();
}
user_module/service.rs
use super::service;
pub fn query_user_api() {
service::query_user();
}
user_module/mapper.rs
pub fn query_user_db() {
println!("query_user_db")
}
然后是 pay_module 模块中的文件,该模块下的service模块下还有两个子模块 alipay_service、wechat_service
pay_module/mod.rs
pub mod service;
pub mod api;
pub mod models;
pay_module/api.rs
pub fn order_pay(goods_order: super::models::GoodsOrder) {
println!("goods_order pay ... begin");
super::service::alipay_service::pay();
super::service::wechat_service::pay();
println!("goods_order pay ... end");
}
pay_module/models.rs
pub struct GoodsOrder {
pub amount: String,
pub note: String,
}
pub enum OrderType {
Alipay,
Wechat,
}
pay_module/service/mod.rs
pub mod alipay_service;
pub mod wechat_service;
pay_module/service/alipay_service.rs
pub fn pay() {
println!("alipay_service");
}
pay_module/service/wechat_service.rs
pub fn pay() {
println!("wechat_service");
}
个人理解 mod.rs 文件是解释当前目录内具有那些子模块,因为目录本身也是一个模块, 当然 mod.rs 中也可以定义函数