Rust语法之模块系统

核心概念说明

  1. 包(Package)

    • 是 Cargo 管理的项目单位,包含一个Cargo.toml配置文件

    • 一个包可以包含:

      • 最多一个库 crate(src/lib.rs
      • 任意数量的二进制 crate(src/main.rssrc/bin/目录下的文件)
    • 示例中的Cargo.toml定义了一个名为code_org_demo的包

  2. Crate

    • 是 Rust 的编译单位,分为两种类型:

      • 库 crate(Library crate):提供可被其他 crate 使用的功能,入口是src/lib.rs
      • 二进制 crate(Binary crate):可执行程序,入口是src/main.rs
    • 示例中包含一个库 crate(src/lib.rs)和一个二进制 crate(src/main.rs

  3. 模块(Module)

    • 使用mod关键字定义,用于组织 crate 内部的代码

    • 可以嵌套定义,形成模块树结构

    • 示例中的模块结构:

      plaintext

      csharp 复制代码
      code_org_demo
      ├── math
      │   ├── basic
      │   └── advanced
      ├── user
      └── internal
  4. 可见性控制(pub

    • Rust 默认所有项(模块、函数、结构体等)都是私有的
    • pub:将项设为公共,允许外部访问
    • pub(crate):仅在当前 crate 内可见
    • pub(super):仅在父模块内可见
    • pub(in path):仅在指定路径的模块内可见
  5. 路径与引用(useas

    • use:引入模块或项,简化代码中的路径引用

    • as:为导入的项创建别名,解决命名冲突

    • 路径类型:

      • 绝对路径:从 crate 根开始(如crate::math::advanced
      • 相对路径:使用self(当前模块)和super(父模块)
  6. 常用导入方式

    • 导入单个项:use module::item;
    • 导入多个项:use module::{item1, item2};
    • 导入所有公共项:use module::*;(通配符导入)
    • 嵌套导入:use module::submodule::item;

二:代码编写 1.创建项目目录结构:

css 复制代码
code_org_demo/
├── Cargo.toml
└── src/
    ├── lib.rs
    └── main.rs

lib.rs 代码

rust 复制代码
//! 代码组织演示库
//! 包含数学工具和用户管理功能

// 定义公共模块 math
pub mod math {
    // 子模块 basic(默认私有,仅在math模块内可见)
    mod basic {
        // 私有函数(仅在basic模块内可见)
        fn add(a: i32, b: i32) -> i32 {
            a + b
        }

        // 公共函数(在父模块可见)
        pub fn subtract(a: i32, b: i32) -> i32 {
            a - b
        }

        // 限制可见性:仅在crate内可见
        pub(crate) fn multiply(a: i32, b: i32) -> i32 {
            a * b
        }
    }

    // 公共子模块 advanced
    pub mod advanced {
        // 使用父模块的功能(super指向math模块)
        use super::basic::multiply;

        /// 计算平方
        pub fn square(x: i32) -> i32 {
            multiply(x, x)
        }

        /// 计算立方
        pub fn cube(x: i32) -> i32 {
            multiply(multiply(x, x), x)
        }
    }

    // 公共API:暴露basic模块的部分功能
    pub use self::basic::subtract;
}

// 定义用户相关模块
pub mod user {
    /// 用户结构体
    #[derive(Debug)]
    pub struct User {
        name: String,
        age: u32,
    }

    impl User {
        /// 创建新用户
        pub fn new(name: String, age: u32) -> Self {
            User { name, age }
        }

        /// 获取用户名
        pub fn get_name(&self) -> &str {
            &self.name
        }

        /// 获取年龄
        pub fn get_age(&self) -> u32 {
            self.age
        }
    }

    // 内部工具函数(私有)
    fn validate_age(age: u32) -> bool {
        age > 0 && age <= 150
    }
}

// 私有模块:仅在当前crate内可见
mod internal {
    pub fn helper() -> &'static str {
        "这是内部辅助函数"
    }
}
    

main.rs

rust 复制代码
//! 代码组织演示主程序

// 引入当前crate的库(lib.rs中定义的内容)
use code_org_demo::math;
use code_org_demo::user::User;

// 使用as关键字为导入项创建别名
use code_org_demo::math::advanced as adv_math;

fn main() {
    // 使用math模块的功能
    println!("10 - 3 = {}", math::subtract(10, 3));
    println!("5的平方 = {}", adv_math::square(5));
    println!("3的立方 = {}", adv_math::cube(3));

    // 使用user模块的功能
    let user = User::new("Alice".to_string(), 30);
    println!("用户: {}, 年龄: {}", user.get_name(), user.get_age());

    // 使用通配符*导入所有公共项
    use code_org_demo::math::advanced::*;
    println!("4的平方 = {}", square(4));

    // 访问内部模块(仅在同一crate内可见)
    println!("内部功能: {}", code_org_demo::internal::helper());
}
    
相关推荐
唐天一5 小时前
Rust面向对象:简单总结impl ... for ... 结构在 Rust 中两种主要用途
后端
唐天一5 小时前
Rust语法之面向对象编程
后端
brzhang5 小时前
Google 浏览器出了一个超级好用的功能,Gemini 原生支持,帮你解决性能问题
前端·后端·架构
京东云开发者6 小时前
KCP协议应用详解:为速度而生的可靠传输协议
后端
洛卡卡了6 小时前
适配私有化部署,我手写了套支持离线验证的 License 授权系统
java·后端·架构
SimonKing6 小时前
亲测有效!分享一个稳定访问GitHub,快速下载资源的实用技巧
java·后端·程序员
这里有鱼汤6 小时前
量化小白必看|MiniQMT踩坑记:想做实盘这些知识请你一定要掌握
后端·python
TechLee6 小时前
Laravel 权限控制新选择:使用 Laravel-authz 集成 PHP-Casbin
后端·php
青梅主码6 小时前
量子位智库最新发布《 AI Coding 玩家图谱》: AI 编码玩家图谱全解析
后端