Rust 模块学习

91 阅读1分钟

仅讨论在一个 crate 内部的模块该如何组织,Rust的模块不像java,不强制目录映射,首次学习是懵的状态,官方的书解释的也不直观。

这里用两个模块做下解释 整体模块关系如下,这个图是用这个工具生成的 cargo-modules,命令:cargo-modules generate tree

image.png

对应文件目录结构

image.png

关键文件是这几个 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 中也可以定义函数