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());
}
    
相关推荐
undsky_几秒前
【RuoYi-SpringBoot3-Pro】:接入 AI 对话能力
人工智能·spring boot·后端·ai·ruoyi
疯狂的程序猴1 分钟前
一次 iOS App 日志排查的真实经历,测试的时候如何查看实时日志
后端
墨守城规2 分钟前
ThreadLocal深入刨析
后端
IMPYLH6 分钟前
Lua 的 IO (输入/输出)模块
开发语言·笔记·后端·lua
爱可生开源社区12 分钟前
SCALE | SQLFlash 在 SQL 优化维度上的表现评估
后端
程序员小假1 小时前
我们来说一下消息的可靠性投递
java·后端
duangww1 小时前
SAPUI5 1.71.78老版本的消费restful服务
后端·restful
用户8599681677691 小时前
UE5虚幻引擎汽车HMI设计高级研修课
后端
用户8599681677691 小时前
鸿蒙HarmonyOS多线程编程实战:AI语音
后端
开心猴爷1 小时前
iOS 应用发布流程中常被忽视的关键环节
后端