Rust

2025年09月22日更新 8 人订阅
原价: ¥ 6 限时优惠
专栏简介 Rust编程语言之错误处理 Rust 语言之 flod Rust编程语言之Cargo、Crates.io详解 Rust编程语言之枚举与模式匹配 Rust语言 - 接口设计的建议之受约束(Constrained) Rust编程语言之无畏并发 Rust语言 - 接口设计的建议之灵活(flexible) Rust语言 - 接口设计的建议之显而易见(Obvious) Rust语言 - 接口设计的建议之不意外(unsurprising) Rust 实战:构建实用的 CLI 工具 HTTPie Rust编程语言学习之高级特性 Rust内存管理揭秘:深度剖析指针与智能指针 解决Rust中数组和切片的编译时大小问题 《Rust编程之道》学习笔记一 Rust Async 异步编程 简易教程 使用 Async Rust 构建简单的 P2P 节点 Rust编程语言入门之模式匹配 Rust async 编程 Rust编程语言之编写自动化测试 Rust编程语言之函数式语言特性:迭代器和闭包 《Rust编程之道》学习笔记二 Rust Tips 比较数值 使用 Rust 开发一个微型游戏 Rust编程初探:深入理解Struct结构体 深入理解Rust中的内存管理:栈、堆与静态内存详解 深入理解 Rust 结构体:经典结构体、元组结构体和单元结构体的实现 深入掌握 Rust 结构体:从模板到实例化的完整指南 深入理解Rust中的结构体:逻辑与数据结合的实战示例 深入理解 Rust 枚举:从基础到实践 掌握Rust字符串的精髓:String与&str的最佳实践 全面解析 Rust 模块系统:实战案例与应用技巧 Rust 中的 HashMap 实战指南:理解与优化技巧 掌握Rust模式匹配:从基础语法到实际应用 Rust 中的面向对象编程:特性与实现指南 深入理解 Rust 的 Pin 和 Unpin:理论与实践解析 Rust Trait 与 Go Interface:从设计到实战的深度对比 从零开始:用 Rust 和 Axum 打造高效 Web 应用 Rust 错误处理详解:掌握 anyhow、thiserror 和 snafu Rust 如何优雅实现冒泡排序 链表倒数 K 节点怎么删?Python/Go/Rust 实战 用 Rust 玩转数据存储:JSON 文件持久化实战 Rust实战:打造高效字符串分割函数 如何高效学习一门技术:从知到行的飞轮效应 Rust 编程入门:Struct 让代码更优雅 Rust 编程:零基础入门高性能开发 用 Rust 写个猜数游戏,编程小白也能上手! Rust 入门教程:变量到数据类型,轻松掌握! 深入浅出 Rust:函数、控制流与所有权核心特性解析 从零开始:用 Rust 和 Axum 打造高效 Web 服务 Rust 集合类型解析:Vector、String、HashMap 深入浅出Rust:泛型、Trait与生命周期的硬核指南 Rust实战:博物馆门票限流系统设计与实现 用 Rust 打造高性能图片处理服务器:从零开始实现类似 Thumbor 的功能 Rust 编程入门实战:从零开始抓取网页并转换为 Markdown 深入浅出 Rust:高效处理二进制数据的 Bytes 与 BytesMut 实战 Rust智能指针:解锁内存管理的进阶之道 用 Rust 打造命令行利器:从零到一实现 mini-grep 解锁Rust代码组织:轻松掌握Package、Crate与Module Rust 所有权:从内存管理到生产力释放 深入解析 Rust 的面向对象编程:特性、实现与设计模式 Rust + Protobuf:从零打造高效键值存储项目 bacon 点燃 Rust:比 cargo-watch 更爽的开发体验 用 Rust 打造微型游戏:从零开始的 Flappy Dragon 开发之旅 函数式编程的Rust之旅:闭包与迭代器的深入解析与实践 探索Rust编程之道:从设计哲学到内存安全的学习笔记 精读《Rust编程之道》:吃透语言精要,彻底搞懂所有权与借用 Rust 避坑指南:搞定数值比较,别再让 0.1 + 0.2 != 0.3 困扰你! 告别 Vec!掌握 Rust bytes 库,解锁零拷贝的真正威力 告别竞态条件:基于 Axum 和 Serde 的 Rust 并发状态管理最佳实践 Rust 异步编程实践:从 Tokio 基础到阻塞任务处理模式 Rust 网络编程实战:用 Tokio 手写一个迷你 TCP 反向代理 (minginx) 保姆级教程:Zsh + Oh My Zsh 终极配置,让你的 Ubuntu 终端效率倍增 不止于后端:Rust 在 Web 开发中的崛起之路 (2024数据解读) Rust核心利器:枚举(Enum)与模式匹配(Match),告别空指针,写出优雅健壮的代码 Rust 错误处理终极指南:从 panic! 到 Result 的优雅之道 想用 Rust 开发游戏?这份超详细的入门教程请收好! 用 Rust 实现 HTTPie:一个现代 CLI 工具的构建过程 Rust 异步实战:从0到1,用 Tokio 打造一个高性能并发聊天室 深入 Rust 核心:彻底搞懂指针、引用与智能指针 Rust 生产级后端实战:用 Axum + sqlx 打造高性能短链接服务 深入 Rust 内存模型:栈、堆、所有权与底层原理 Rust 核心概念解析:引用、借用与内部可变性 掌握 Rust 核心:生命周期与借用检查全解析 Rust 内存布局深度解析:从对齐、填充到 repr 属性 Rust Trait 分派机制:静态与动态的抉择与权衡 Rust Thread::Builder 用法详解:线程命名与栈大小设置 Rust 泛型 Trait:关联类型与泛型参数的核心区别 Rust Scoped Threads 实战:更安全、更简洁的并发编程 Rust 核心设计:孤儿规则与代码一致性解析 Rust 实战:从零构建一个多线程 Web 服务器 Rust Web 开发实战:构建教师管理 API 硬核实战:从零到一,用 Rust 和 Axum 构建高性能聊天服务后端 Rust Web 开发实战:使用 SQLx 连接 PostgreSQL 数据库 硬核入门:从零开始,用 Actix Web 构建你的第一个 Rust REST API (推荐 🔥) Rust 并发编程:详解线程间数据共享的几种核心方法 Rust并发安全基石:Mutex与RwLock深度解析 Rust Web实战:构建优雅的 Actix Web 统一错误处理 煮咖啡里的大学问:用 Rust Async/Await 告诉你如何边烧水边磨豆 深入浅出:Rust 原子类型与多线程编程实践 Rust 并发编程利器:OnceCell 与 OnceLock 深度解析 Rust 懒人编程:LazyCell 与 LazyLock 的惰性哲学 Rust 入门精髓:详解 Enum 的三种魔法,从模式匹配到状态管理 Rust 字符串魔法:String 与 &str 的深度解析与实践 Rust 模块化编程:驾驭代码结构与可见性的三大法则

Rust 模块化编程:驾驭代码结构与可见性的三大法则

Rust模块化编程:驾驭代码结构与可见性的三大法则随着项目规模的增长,代码的组织和管理变得至关重要。Rust语言通过其独特的模块(mod)系统,为开发者提供了一套强大而灵活的代码结构化工具,同时严格控制了代码的可见性,从而保障了项目的安全性和可维护性。如果你希望编写出既整洁又高效的Rust

Rust 模块化编程:驾驭代码结构与可见性的三大法则

随着项目规模的增长,代码的组织和管理变得至关重要。Rust 语言通过其独特的模块(mod)系统,为开发者提供了一套强大而灵活的代码结构化工具,同时严格控制了代码的可见性,从而保障了项目的安全性和可维护性。如果你希望编写出既整洁又高效的 Rust 应用,深入理解模块化是必不可少的一步。本文将通过三个循序渐进的实例,带你领略 Rust 模块化的艺术,助你更好地驾驭大型代码库。

实操

示例一

// modules1.rs

mod sausage_factory {
    // Don't let anybody outside of this module see this!
    fn get_secret_recipe() -> String {
        String::from("Ginger")
    }

    pub fn make_sausage() {
        get_secret_recipe();
        println!("sausage!");
    }
}

fn main() {
    sausage_factory::make_sausage();
}

这段 Rust 代码展示了模块(mod)的基本概念,它是 Rust 管理代码结构和控制可见性的核心工具。sausage_factory 是一个独立的模块,它将与香肠制作相关的代码封装在一起。模块内部的函数默认是私有的,只能在模块内部被调用,例如 get_secret_recipe 函数。然而,make_sausage 函数被标记为 pub(public),这意味着它可以在 sausage_factory 模块外部被访问,例如在 main 函数中被调用。这个例子完美地说明了 Rust 的私有性原则:你可以将相关功能组织到模块中,并只通过公开(pub)接口暴露你需要外部访问的部分,从而隐藏实现细节,保证代码的封装性和安全性。

示例二

// modules2.rs

mod delicious_snacks {
    pub use self::fruits::PEAR as fruit;
    pub use self::veggies::CUCUMBER as veggie;

    mod fruits {
        pub const PEAR: &'static str = "Pear";
        pub const APPLE: &'static str = "Apple";
    }

    mod veggies {
        pub const CUCUMBER: &'static str = "Cucumber";
        pub const CARROT: &'static str = "Carrot";
    }
}

fn main() {
    println!(
        "favorite snacks: {} and {}",
        delicious_snacks::fruit,
        delicious_snacks::veggie
    );
}

这段 Rust 代码展示了模块化和 pub use 关键字的强大功能。它定义了一个名为 delicious_snacks 的父模块,其中又嵌套了 fruitsveggies 两个子模块。在子模块中,PEARCUCUMBER 等常量被定义为 pub,这使得它们在各自的子模块内部是可见的。然而,为了让 main 函数能够更方便地访问这些常量,父模块 delicious_snacks 使用了 pub use 关键字。pub use 不仅在 delicious_snacks 模块内部引入了 PEARCUCUMBER,还将它们重新导出,使得外部代码(如 main 函数)可以直接通过 delicious_snacks::fruitdelicious_snacks::veggie 这样的简洁路径来访问它们,而无需关心它们在哪个子模块中,从而简化了 API 并提高了代码的可读性。

示例三

// modules3.rs

use std::time::{SystemTime, UNIX_EPOCH};

fn main() {
    match SystemTime::now().duration_since(UNIX_EPOCH) {
        Ok(n) => println!("1970-01-01 00:00:00 UTC was {} seconds ago!", n.as_secs()),
        Err(_) => panic!("SystemTime before UNIX EPOCH!"),
    }
}

这段 Rust 代码展示了如何使用 use 关键字引入外部模块,并利用 match 表达式来安全地处理可能出错的结果。它从标准库的 std::time 模块中引入了 SystemTimeUNIX_EPOCH 这两个类型。在 main 函数中,SystemTime::now() 获取当前时间,然后调用 duration_since(UNIX_EPOCH) 方法来计算当前时间与 Unix 纪元时间(1970年1月1日)之间的时间差。这个方法返回一个 Result 类型,它可能是一个成功 (Ok) 的结果(包含时间差),也可能是一个失败 (Err) 的结果(如果系统时间早于 Unix 纪元)。代码使用 match 表达式对这个 Result 进行模式匹配:如果成功,它会打印出时间差的秒数;如果失败,它会触发一个 panic! 宏,导致程序崩溃并报告错误。这个例子很好地体现了 Rust 在处理可失败操作时,通过 Result 枚举和 match 模式匹配来强制开发者处理所有可能结果的设计哲学,从而保证了程序的健壮性。

总结

通过这三个循序渐进的示例,我们深入学习了 Rust 模块化编程的精髓。我们首先了解了 mod 关键字如何用于封装代码和实现私有性,确保了内部实现细节不被外部随意访问。接着,我们探索了 pub use 关键字,它不仅可以在模块内部引入项,还能将其重新导出,有效简化了外部访问路径,提升了 API 的易用性。最后,我们看到了 use 关键字在导入标准库模块和处理 Result 错误时的实际应用,这体现了 Rust 在类型系统和错误处理上的严谨性。掌握 Rust 的模块系统,不仅能让你更好地组织代码,提高项目的可读性和可维护性,更是你编写大型、复杂 Rust 应用的基础。

参考

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论