11 2023 档案
摘要:本文转载自微信公众号:《兔子写代码》 概述 Sized 其实是 Rust 中最重要的概念之一,可谓功成不居。它往往以微妙的形式与其他语言特性交织在一起,只有在形如 x doesn't have size known at compile time 的错误信息中才会显露,这些错误信息对于每个 Rust
阅读全文
摘要:楔子 本次来聊一聊 Rust 的宏,但在讲如何使用宏、如何构建宏之前,我们要先搞清楚为什么会出现宏。 这要从设计非常独特的 Lisp 语言讲起,在 Lisp 的世界里,有句名言:代码即数据,数据即代码(Code is data, data is code)。如果你有 Lisp 相关的开发经验,或者听
阅读全文
摘要:指针和指针的类型 如果一个变量里面存的是另一个变量在内存里的地址,那么这个变量就被叫做指针,引用(用 & 号表示)就是一种指针。并且引用是必定有效的指针,它一定指向一个目前有效(比如没有被释放掉)的类型实例,而指针不一定是引用。也就是说,在 Rust 中还有一些其它类型的指针存在,我们下面就来学习其
阅读全文
摘要:楔子 任何一门语言,原生的数据类型就那么几个,剩下的都是容器,容器占据了数据结构的半壁江山。当然提到容器,你首先想到的就是数组、列表这些可以遍历的容器,但其实只要把某种特定的数据封装在某个数据结构中,这个数据结构就是一个容器。比如 Option,它是一个包裹了 T 的容器,而 Cow 是一个封装了内
阅读全文
摘要:楔子 上一篇文章我们花费相当大的笔墨复习并补充了 trait 的知识,本次来介绍一下标准库中的 trait(前面文章已经详细说过的,这里就不赘述了)。Rust 标准库中包含大量的 trait 定义,甚至 Rust 自身的某些语言特性就是在这些 trait 的帮助下实现的。这些 trait 和标准库里
阅读全文
摘要:楔子 本篇文章来聊一聊 trait,准确的说是复习一下 trait,并补充一些之前遗漏的内容。 我们说过 Rust 一切皆类型,由 trait 定义类型的行为逻辑。trait 非常重要,如果把所有权比作 Rust 的心脏,那么类型+trait就是 Rust 的大脑。那么问题来了,什么是 trait
阅读全文
摘要:楔子 我们学习了很多有关所有权和生命周期的内容,想必现在,你对 Rust 内存管理的核心思想已经有足够的理解了。通过单一所有权模式,Rust 解决了堆内存过于灵活、不容易安全高效地释放的问题,既避免了手动释放内存带来的巨大心智负担和潜在的错误,又避免了全局引入追踪式 GC 或者 ARC 这样的额外机
阅读全文
摘要:楔子 今天我们一起来回顾一下在 Rust 中高频使用的 Option<T>、Result<T, E>、迭代器,通过学习这些内容,我们可以继续夯实集合中所有权相关的知识点。 Option<T> 和 Result<T, E> 并不是 Rust 的独创设计,在 Rust 之前,OCaml、Haskell、
阅读全文
摘要:本次来聊一聊生命周期,虽然是已经说过的内容,但难免会有遗漏(特别是看了很多大佬的文章之后),所以适当回顾一下做个补充也是有必要的。 在任何语言里,栈上的值都有自己的生命周期,它和所在栈帧的生命周期保持一致。而 Rust,进一步明确这个概念,并且为堆上的内存也引入了生命周期。我们知道,在其它语言中,堆
阅读全文
摘要:楔子 之前介绍的单一所有权规则,能满足我们大部分场景中分配和使用内存的需求,而且在编译时,通过 Rust 借用检查器就能完成静态检查,不会影响运行时效率。但规则总会有例外,在日常工作中有些特殊情况该怎么处理呢?比如: 一个有向无环图(DAG)中,某个节点可能有两个以上的节点指向它,这个按照所有权模型
阅读全文