当前位置: 首页 > news >正文

学习笔记十八——Rust 封装

🧱 Rust 封装终极指南:结构体、模块、Trait、目录结构与模块引用


🧭 目录导航

  1. 什么是封装?Rust 的封装理念
  2. Rust 的封装工具总览
  3. 模块(mod)和访问控制(pub)详解
  4. 结构体和枚举:封装数据
  5. implself:封装行为
  6. Trait:行为的抽象封装与多态实现
  7. 目录结构设计与模块引用
  8. 实战案例:带 Trait 的完整封装模块系统
  9. 总结:Rust 的封装哲学

1️⃣ 什么是封装?Rust 是怎么理解封装的?

封装的本质是:

将数据与操作它的方法组织在一起,并对外隐藏实现细节,只暴露对外接口。

Rust 提供了现代化、静态安全的封装机制,它不像 Java 有 class,但功能上实现了同样甚至更强的封装能力。


2️⃣ Rust 的封装工具总览

工具功能举例
struct / enum封装一组字段struct User { name, password }
impl给数据添加方法impl User { fn login(&self) { ... } }
mod + pub封装逻辑模块 + 控制访问mod user;, pub fn login()
trait抽象行为、实现接口、多态封装trait Printable { fn print(&self); }

3️⃣ 模块和 pub:控制访问边界

Rust 的模块系统是封装最重要的边界控制工具。

  • 所有内容默认私有
  • pub 显式开放
  • 模块和目录一一对应(mod.rs 或新写法 modname.rs + 子模块)

4️⃣ 结构体和枚举:封装数据

pub struct User {pub name: String,password: String, // 私有字段
}pub enum LoginStatus {Success,Failure(String),
}
  • struct 封装实体数据
  • enum 封装状态、结果、多种可能性

5️⃣ impl 和 self:封装方法与行为

impl User {pub fn new(name: &str, pwd: &str) -> Self {Self {name: name.to_string(),password: pwd.to_string(),}}pub fn check_password(&self, input: &str) -> bool {self.password == input}
}

6️⃣ Trait:封装行为的抽象方式

✅ 什么是 Trait?

Trait(特征)类似于 Java 的接口(interface):

  • 它定义了某种能力/行为的抽象
  • structenum 可以实现多个 trait
  • 外部通过 trait 使用对象,无需关心具体类型

🧠 举个例子:定义一个能“打印”的 trait

pub trait Printable {fn print(&self);
}

实现 trait:

pub struct User {pub name: String,
}impl Printable for User {fn print(&self) {println!("User: {}", self.name);}
}

🛠 Trait 的用法和封装意义

  1. 隐藏内部结构,只暴露行为接口
  2. 支持多态:多个类型实现同一个 trait
  3. 实现解耦:代码依赖于 trait 而不是具体类型

✨ Trait 封装进模块

你可以将 trait 和实现都封装在模块里:

// user/traits.rs
pub trait Printable {fn print(&self);
}
// user/mod.rs
mod traits;
pub use traits::Printable;pub struct User {pub name: String,
}impl Printable for User {fn print(&self) {println!("User: {}", self.name);}
}

外部模块这样使用:

use user::{User, Printable};fn main() {let u = User { name: "Tom".to_string() };u.print(); // 调用 trait 方法
}

🧪 高级技巧:Trait 作为函数参数(多态)

fn show_info(item: &impl Printable) {item.print();
}

或更通用写法:

fn show_info<T: Printable>(item: &T) {item.print();
}

这样你就实现了“只看能力,不看具体类型”。


7️⃣ 模块系统与封装结构设计

项目结构举例(目录 + 封装 + trait):

src/
├── main.rs
├── user/
│   ├── mod.rs
│   ├── model.rs      // 数据结构
│   ├── service.rs    // 行为逻辑
│   └── traits.rs     // trait 定义
├── order/
│   ├── mod.rs
│   └── db.rs
└── utils.rs

每个模块目录都包含一个 mod.rs,作为该模块的根,里面:

pub mod model;
pub mod service;
pub mod traits;pub use traits::*;
pub use model::User;

然后在 main.rs 中:

mod user;use user::{User, Printable};fn main() {let user = User::new("Alice");user.print();
}

🧠 8️⃣ 封装案例总结:Trait + 模块 + impl 的组合拳

内容用途封装表现
struct / enum数据载体私有字段保护数据不被外部访问
impl方法实现把行为挂在数据上
trait抽象接口通过能力驱动调用,不关心类型
mod / pub模块组织文件结构决定模块结构,pub 决定可访问性
目录结构工程可维护性按功能拆模块,模块拆 trait/model/service

✅ 9️⃣ 最终总结:Rust 封装哲学一句话

“能看什么是你说了算,能做什么是 trait 决定的,内部怎么做是我的事。”

Rust 提供了非常强大且显式的封装能力,它将“数据安全、接口清晰、逻辑隔离”做到了极致。

相关文章:

  • 【UniApp】Vue2 scss 预编译器默认已由 node-sass 更换为 dart-sass
  • NFC碰一碰发视频系统OEM定制,源码搭建注意事项
  • 【FreeRTOS进阶】优先级翻转现象详解及解决方案
  • React-useRef
  • 【Redis】从单机架构到分布式,回溯架构的成长设计美学
  • 数据驱动增长:大数据与营销自动化的结合之道
  • 学习设计模式《三》——适配器模式
  • Java 并发性能优化:线程池的最佳实践
  • 【上海大学计算机系统结构实验报告】多机环境下MPI并行编程
  • Ai Agent 在生活领域的深度应用与使用指南
  • Flink介绍——实时计算核心论文之Kafka论文总结
  • NoSQl注入学习
  • OpenLayers:视图变换的方法
  • Python语法系列博客 · 第3期 数据结构入门(列表、元组、字典、集合)
  • 从代码学习深度学习 - 优化算法 PyTorch 版
  • MPTCP 的吞吐困局
  • ICS丨Chapter 1 Introduction to Computer System
  • MFC文件-屏幕录像
  • C 语言联合与枚举:自定义类型的核心解析
  • [Swift]Xcode模拟器无法请求http接口问题
  • 五一假期出行预订进入高潮:酒店搜索热度翻倍,“请4休11”拼假带动长线游
  • 科普|军团菌肺炎:春末夏初的隐形健康威胁
  • 95后男中音胡斯豪敲开芝加哥抒情歌剧院大门
  • 解读丨连续两日施压,特朗普为何着急让美联储降息
  • 姜仁华任中国水稻研究所所长,胡培松院士卸任
  • 上海一季度人民币贷款增4151亿,住户存款增3134亿