Rust 模块系统:控制作用域与私有性

文章目录

Rust 模块系统:控制作用域与私有性

模块(mod)是 Rust 组织代码的核心机制,用于封装代码、管理作用域和实现私有性控制。核心概念包括:模块声明路径(paths)pub 公开性use 快捷引用


一、模块声明规则
  1. 起点:Crate 根文件

    • 编译器从 crate 根文件开始编译:
      • 库 crate:src/lib.rs
      • 二进制 crate:src/main.rs
  2. 声明模块的三种方式

    在 crate 根文件声明 mod garden; 时,编译器按顺序查找:

    • 内联代码:mod garden { /* 代码 */ }
    • 文件 src/garden.rs
    • 文件 src/garden/mod.rs
  3. 子模块声明

    在非根文件(如 src/garden.rs)中声明子模块 mod vegetables; 时,查找位置:

    • 内联代码:mod vegetables { /* 代码 */ }
    • 文件 src/garden/vegetables.rs
    • 文件 src/garden/vegetables/mod.rs

文件结构示例

复制代码
backyard
├── Cargo.toml
└── src
    ├── garden
    │   └── vegetables.rs  // 子模块代码
    ├── garden.rs         // 模块声明
    └── main.rs           // crate 根

二、路径(Paths)访问规则
  • 通过路径访问模块内项(如结构体、函数):

    rust 复制代码
    crate::garden::vegetables::Asparagus // 绝对路径
  • 路径类型:

    • 绝对路径 :从 crate 根开始
    • 相对路径 :从 self(当前模块)或 super(父模块)开始

三、私有性控制(pub 关键字)
  1. 默认私有

    • 模块内项(函数/结构体等)默认 对父模块私有
    • 子模块可访问父模块,但父模块不能访问子模块私有项。
  2. 公开作用域

    rust 复制代码
    pub mod garden {          // 公开模块
        pub mod vegetables {   // 公开子模块
            pub struct Asparagus; // 公开项
        }
    }
    • pub mod:使模块可从外部访问
    • pub 修饰项:使模块内的特定项公开

四、use 关键字:简化路径
  • 创建快捷方式避免重复长路径:

    rust 复制代码
    use crate::garden::vegetables::Asparagus;
    fn main() {
        let plant = Asparagus; // 直接使用短名
    }
  • 常用组合:

    rust 复制代码
    use crate::garden::vegetables; // 引入模块,通过 vegetables::Asparagus 访问
    use crate::garden::vegetables::Asparagus as Veg; // 重命名

五、模块树结构示例

代码示例(餐厅管理系统):

rust 复制代码
// src/lib.rs
mod front_of_house {     // 模块
    pub mod hosting {     // 子模块(公开)
        pub fn add_to_waitlist() {} // 公开函数
    }
}

模块树结构

复制代码
crate
└── front_of_house
    └── hosting
        └── add_to_waitlist

关键总结
机制 作用 示例
mod 声明模块 mod garden;
pub 公开模块或项 pub fn seat_at_table()
crate:: 绝对路径起点 crate::garden::Asparagus
use 创建路径别名 use crate::garden;
文件系统映射 模块与文件自动关联 garden.rsmod garden

模块系统通过文件路径映射和层级访问控制,实现了代码的高效组织与封装,是 Rust 安全性的重要基石。

相关推荐
To_OC6 小时前
手写 AI 编程 Agent 的命令执行工具:我被 child_process 坑出来的实战经验
后端·node.js·agent
科技道人6 小时前
记录 默认置灰/禁用 app ‘Search Engine Selector‘ 的disable按钮
开发语言·前端·javascript
花褪残红青杏小8 小时前
Rust图像处理第18节-分形画布缩放 + 拖拽交互:图像缩放 + f32 性能优化
rust·webassembly·图形学
逝水无殇8 小时前
C# 异常处理详解
开发语言·后端·c#
doiito9 小时前
【开源项目】用 Rust 重构中文 TTS!kokoroi-rs 高性能语音合成引擎介绍
ai·rust
玖玥拾10 小时前
C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库
服务器·开发语言·网络·数据库·mysql·c#
铅笔侠_小龙虾10 小时前
Rust 学习目录
开发语言·学习·rust
考虑考虑11 小时前
Sentinel安装
java·后端·微服务
IT_陈寒11 小时前
SpringBoot自动配置失灵?你可能忘了这个关键注解
前端·人工智能·后端
云泽80811 小时前
从零吃透 C++ 异常:抛出捕获、栈展开、异常重抛与编码规范详解
开发语言·c++·代码规范