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());
}
    
相关推荐
资深web全栈开发2 小时前
[特殊字符]图解 Golang 反射机制:从底层原理看动态类型的秘密
开发语言·后端·golang
西岭千秋雪_2 小时前
Zookeeper实现分布式锁
java·分布式·后端·zookeeper·wpf
码事漫谈8 小时前
智能体颠覆教育行业调研报告:英语、编程、语文、数学学科应用分析
后端
蓝-萧8 小时前
使用Docker构建Node.js应用的详细指南
java·后端
码事漫谈8 小时前
《C语言点滴》——笑着入门,扎实成长
后端
Tony Bai9 小时前
【Go模块构建与依赖管理】09 企业级实践:私有仓库与私有 Proxy
开发语言·后端·golang
咖啡教室9 小时前
每日一个计算机小知识:ICMP
后端·网络协议
间彧9 小时前
OpenStack在混合云架构中通常扮演什么角色?
后端
咖啡教室9 小时前
每日一个计算机小知识:IGMP
后端·网络协议
间彧9 小时前
云原生技术栈中的核心组件(如Kubernetes、Docker)具体是如何协同工作的?
后端