4.4.5 Cell 与 RefCell 内部可变性 Cell 和 RefCell Rust 的编译器之严格,可以说是举世无双。特别是在所有权方面,Rust 通过严格的规则来保证所有权和借用的正确性,最终为程序的安全保驾护航。 但是严格是一把双刃剑,带来安全提升的同时,损失了灵活性,有时甚至会让用户痛苦不堪、怨声载道。因此 Rust 提供了 Cell 和 RefCell 用于内部可变性,简而言之,可以在拥有不可变引用的同时修改目标数据,对于 2025-02-05 rust > rust圣经 > rust高级进阶 #rust
4.4.4 Rc 与 Arc 实现 1vN 所有权机制 Rc 与 Arc Rust 所有权机制要求一个值只能有一个所有者,在大多数情况下,都没有问题,但是考虑以下情况: 在图数据结构中,多个边可能会拥有同一个节点,该节点直到没有边指向它时,才应该被释放清理 在多线程中,多个线程可能会持有同一个数据,但是你受限于 Rust 的安全机制,无法同时获取该数据的可变引用 以上场景不是很常见,但是一旦遇到,就非常棘手,为了解决此类问题,Rus 2025-02-05 rust > rust圣经 > rust高级进阶 #rust
4.4.3 Drop 释放资源 Drop 释放资源 在 Rust 中,我们之所以可以一拳打跑 GC 的同时一脚踢翻手动资源回收,主要就归功于 Drop 特征,同时它也是智能指针的必备特征之一。 1. 学习目标 如何自动和手动释放资源及执行指定的收尾工作 2. Rust 中的资源回收 在一些无 GC 语言中,程序员在一个变量无需再被使用时,需要手动释放它占用的内存资源,如果忘记了,那么就会发生内存泄漏,最终臭名昭著 2025-02-05 rust > rust圣经 > rust高级进阶 #rust
4.4.2 Deref 解引用 Deref 解引用 在开始之前,我们先来看一段代码: 123456789101112131415#[derive(Debug)]struct Person { name: String, age: u8}impl Person { fn new(name: String, age: u8) -> Self { Per 2025-02-05 rust > rust圣经 > rust高级进阶 #rust
4.4.1 Box堆对象分配 Box 堆对象分配 如果说 Box<T> 是不是 Rust 中最常见的智能指针,那估计没有任何争议。因为 Box<T> 允许你将一个值分配到堆上,然后在栈上保留一个智能指针指向堆上的数据。 之前我们在所有权章节简单讲过堆栈的概念,这里再补充一些。 1. Rust 中的堆栈 栈内存从高位地址向下增长,且栈内存是连续分配的,一般来说操作系统对栈内存的大小都有限制,因 2025-02-05 rust > rust圣经 > rust高级进阶 #rust
4.4 智能指针 智能指针 在各个编程语言中,指针的概念几乎都是相同的:指针是一个包含了内存地址的变量,该内存地址引用或者指向了另外的数据。 在 Rust 中,最常见的指针类型是引用,引用通过 & 符号表示。不同于其它语言,引用在 Rust 中被赋予了更深层次的含义,那就是:借用其它变量的值。引用本身很简单,除了指向某个值外并没有其它的功能,也不会造成性能上的额外损耗,因此是 Rust 中使用最多 2025-02-05 rust > rust圣经 > rust高级进阶 #rust
4.3.4 枚举和整数 整数转换为枚举 在 Rust 中,从枚举到整数的转换很容易,但是反过来,就没那么容易,甚至部分实现还挺邪恶, 例如使用transmute。 1. 一个真实场景的需求 在实际场景中,从整数到枚举的转换有时还是非常需要的,例如你有一个枚举类型,然后需要从外面传入一个整数,用于控制后续的流程走向,此时就需要用整数去匹配相应的枚举(你也可以用整数匹配整数-, -,看看会不会被喷)。 既然有了 2025-02-05 rust > rust圣经 > rust高级进阶 #rust
4.3.3 Sized 和不定长类型 DST Sized 和不定长类型 DST 在 Rust 中类型有多种抽象的分类方式,例如本书之前章节的:基本类型、集合类型、复合类型等。再比如说,如果从编译器何时能获知类型大小的角度出发,可以分成两类: 定长类型( sized ),这些类型的大小在编译时是已知的 不定长类型( unsized ),与定长类型相反,它的大小只有到了程序运行时才能动态获知,这种类型又被称之为 DST 首先 2025-02-05 rust > rust圣经 > rust高级进阶 #rust
4.3.2 newtype 和 类型别名 深入 Rust 类型 弱弱地、不负责任地说,Rust 的学习难度之恶名,可能有一半来源于 Rust 的类型系统,而其中一半的一半则来自于本章节的内容。在本章,我们将重点学习如何创建自定义类型,以及了解何为动态大小的类型。 1. newtype 何为 newtype?简单来说,就是使用元组结构体的方式将已有的类型包裹起来:struct Meters(u32);,那么此处 Meters 就是 2025-02-05 rust > rust圣经 > rust高级进阶 #rust
4.3.1 类型转换 类型转换 Rust 是类型安全的语言,因此在 Rust 中做类型转换不是一件简单的事,这一章节我们将对 Rust 中的类型转换进行详尽讲解。 高能预警:本章节有些难,可以考虑学了进阶后回头再看 1. as转换 先来看一段代码: 12345678fn main() { let a: i32 = 10; let b: u16 = 100; if a < b 2025-02-05 rust > rust圣经 > rust高级进阶 #rust