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());
}
    
相关推荐
小gaigagi几秒前
旺店通·旗舰奇门数据集成到金蝶云星空的技术实现案例
后端
用户607320369458 分钟前
Python 入门必备-pip install 常用命令例子大全:从基础安装到国内镜像加速实战
后端
小小小前端啊12 分钟前
前端网络知识指南
后端
野犬寒鸦1 小时前
Claude Code:终端AI编程助手全指南(附带指令全讲解)
开发语言·后端·面试·ai编程
老马95271 小时前
opencode7-桌面应用实战2
java·人工智能·后端
笑而不语1 小时前
01|搭建 gemini-demo:Spring Boot 3 + LangChain4j + Gemini
后端
SamDeepThinking1 小时前
DDD领域驱动设计三年落地实战-开篇词
后端·程序员·架构
DeepNoMind2 小时前
从入门到 Offer:系统设计面试的完整备考路线
后端
阿丰资源2 小时前
基于Springboot+mysql的在线兼职平台(附源码)
spring boot·后端·mysql
小村儿3 小时前
连载
前端·后端·ai编程