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());
}
    
相关推荐
索荣荣4 小时前
Java Session 全面指南:原理、应用与实践(含 Spring Boot 实战)
java·spring boot·后端
千寻技术帮5 小时前
10333_基于SpringBoot的家电进存销系统
java·spring boot·后端·源码·项目·家电进存销
dear_bi_MyOnly5 小时前
【多线程——线程状态与安全】
java·开发语言·数据结构·后端·中间件·java-ee·intellij-idea
小信丶6 小时前
@EnableTransactionManagement注解介绍、应用场景和示例代码
java·spring boot·后端
To Be Clean Coder7 小时前
【Spring源码】createBean如何寻找构造器(四)——类型转换与匹配权重
java·后端·spring
-孤存-7 小时前
SpringBoot核心注解与配置详解
java·spring boot·后端
2301_818732068 小时前
项目启动报错,错误指向xml 已解决
xml·java·数据库·后端·springboot
小王不爱笑1328 小时前
SpringBoot 整合 Ollama + 本地 DeepSeek 模型
java·spring boot·后端
短剑重铸之日10 小时前
《设计模式》第七篇:适配器模式
java·后端·设计模式·适配器模式
树码小子11 小时前
SpringIoC & DI (1):IOC介绍 & Spring IoC使用 & DI
java·后端·spring