2.12.2 模块 Module 模块 Module 在本章节,我们将深入讲讲 Rust 的代码构成单元:模块。使用模块可以将包中的代码按照功能性进行重组,最终实现更好的可读性及易用性。同时,我们还能非常灵活地去控制代码的可见性,进一步强化 Rust 的安全性。 1. 创建嵌套模块 使用 cargo new --lib restaurant 创建一个小餐馆,注意,这里创建的是一个库类型的 Package,然后将以下代 2025-01-05 rust > rust圣经 > rust基础 #rust
2.12.1 包 Crate 包和 Package 当读者按照章节顺序读到本章时,意味着你已经几乎具备了参与真实项目开发的能力。但是真实项目远比我们之前的 cargo new 的默认目录结构要复杂,好在,Rust 为我们提供了强大的包管理工具: 项目(Package):可以用来构建、测试和分享包 工作空间(WorkSpace):对于大型项目,可以进一步将多个包联合在一起,组织成工作空间 包(Crate):一个由 2025-01-05 rust > rust圣经 > rust基础 #rust
2.12 包和模块 包和模块 当工程规模变大时,把代码写到一个甚至几个文件中,都是不太聪明的做法,可能存在以下问题: 单个文件过大,导致打开、翻页速度大幅变慢 查询和定位效率大幅降低,类比下,你会把所有知识内容放在一个几十万字的文档中吗? 只有一个代码层次:函数,难以维护和协作,想象一下你的操作系统只有一个根目录,剩下的都是单层子目录会如何:disaster 容易滋生 Bug 同时,将大的代码文件 2025-01-05 rust > rust圣经 > rust基础 #rust
2.11.2 返回值 Result 和 ? 可恢复的错误 Result 还记得上一节中,提到的关于文件读取的思考题吧?当时我们解决了读取文件时遇到不可恢复错误该怎么处理的问题,现在来看看,读取过程中,正常返回和遇到可以恢复的错误时该如何处理。 假设,我们有一台消息服务器,每个用户都通过 websocket 连接到该服务器来接收和发送消息,该过程就涉及到 socket 文件的读写,那么此时,如果一个用户的读写发生了错误,显然不能直接 2025-01-05 rust > rust圣经 > rust基础 #rust
2.11.1 panic 深入剖析 panic 深入剖析 在正式开始之前,先来思考一个问题:假设我们想要从文件读取数据,如果失败,你有没有好的办法通知调用者为何失败?如果成功,你有没有好的办法把读取的结果返还给调用者? 1. panic! 与不可恢复错误 上面的问题在真实场景会经常遇到,其实处理起来挺复杂的,让我们先做一个假设:文件读取操作发生在系统启动阶段。那么可以轻易得出一个结论,一旦文件读取失败,那么系统启动也将失败,这 2025-01-05 rust > rust圣经 > rust基础 #rust
2.11 返回值和错误处理 返回值和错误处理 1. Rust 的错误哲学 错误对于软件来说是不可避免的,因此一门优秀的编程语言必须有其完整的错误处理哲学。在很多情况下,Rust 需要你承认自己的代码可能会出错,并提前采取行动,来处理这些错误。 Rust 中的错误主要分为两类: 可恢复错误,通常用于从系统全局角度来看可以接受的错误,例如处理用户的访问、操作等错误,这些错误只会影响某个用户自身的操作进程,而不会对系 2025-01-05 rust > rust圣经 > rust基础 #rust
2.10 认识生命周期 认识生命周期 生命周期,简而言之就是引用的有效作用域。在大多数时候,我们无需手动的声明生命周期,因为编译器可以自动进行推导,用类型来类比下: 就像编译器大部分时候可以自动推导类型 <-> 一样,编译器大多数时候也可以自动推导生命周期 在多种类型存在时,编译器往往要求我们手动标明类型 <-> 当多个生命周期存在,且编译器无法推导出某个引用的生命周期时,就需要我们 2025-01-05 rust > rust圣经 > rust基础 #rust
2.9.2 KV存储 HashMap KV 存储 HashMap 和动态数组一样,HashMap 也是 Rust 标准库中提供的集合类型,但是又与动态数组不同,HashMap 中存储的是一一映射的 KV 键值对,并提供了平均复杂度为 O(1) 的查询方法,当我们希望通过一个 Key 去查询值时,该类型非常有用,以致于 Go 语言将该类型设置成了语言级别的内置特性。 Rust 中哈希类型(哈希映射)为 HashMap&l 2025-01-05 rust > rust圣经 > rust基础 #rust
2.9.1 动态数组 Vector 动态数组 Vector 动态数组类型用 Vec<T> 表示,事实上,在之前的章节,它的身影多次出现,我们一直没有细讲,只是简单的把它当作数组处理。 动态数组允许你存储多个值,这些值在内存中一个紧挨着另一个排列,因此访问其中某个元素的成本非常低。动态数组只能存储相同类型的元素,如果你想存储不同类型的元素,可以使用之前讲过的枚举类型或者特征对象。 总之,当我们想拥有一个列表,里面都 2025-01-05 rust > rust圣经 > rust基础 #rust
2.9 集合类型 集合类型 集合在 Rust 中是一类比较特殊的类型,因为 Rust 中大多数数据类型都只能代表一个特定的值,但是集合却可以代表一大堆值。而且与语言级别的数组、字符串类型不同,标准库里的这些家伙是分配在堆上,因此都可以进行动态的增加和减少。 瞧,第一个集合排着整齐的队列登场了,它里面的每个元素都雄赳赳气昂昂跟在另外一个元素后面,大小、宽度、高度竟然全部一致,真是令人惊叹。 它就是 Vecto 2025-01-05 rust > rust圣经 > rust基础 #rust