
Rust中级教程
文章平均质量分 92
SomeB1oody
会努力更新的,保证每天必更一到两篇,不更更多是因为流量券一天最多就2篇
展开
-
【Rust中级教程】2.13. 结语(杂谈):我学习Rust的心路历程
Rust学习到此结束!原创 2025-02-26 07:00:54 · 886 阅读 · 0 评论 -
【Rust中级教程】题外话:Rust + Python联合编程(基于Maturin)
Rust性能好,但是代码难写。Python代码好写,但是性能不好。那为什么不把两者结合起来呢?让Python在顶层调用,用Rust写性能敏感的模块。原创 2025-02-26 06:57:50 · 1350 阅读 · 0 评论 -
【Rust中级教程】2.11. API设计原则之受约束性(constrained) Pt.2:封闭trait(sealed trait)、重新导出(re-exports)、自动trait
Rust的一致性规则禁止了对某个trait为某类型进行多重实现。原创 2025-02-25 06:24:04 · 669 阅读 · 0 评论 -
【Rust中级教程】2.10. API设计原则之受约束性(constrained) Pt.1:对类型进行修改、`#[non_exhaustive]`注解
如果你移除或重命名一个公共类型几乎肯定会破坏用户的代码,解决办法就是尽可能利用可见性修饰符原创 2025-02-25 06:22:16 · 847 阅读 · 0 评论 -
【Rust中级教程】2.9. API设计原则之显然性(obvious) :文档与类型系统、语义化类型、使用“零大小”类型
用户可能不会完全理解API的所有规则和限制。所以你写的API应该让你的用户易于理解,并且难以用错。原创 2025-02-24 07:54:22 · 983 阅读 · 0 评论 -
【Rust中级教程】2.8. API设计原则之灵活性(flexible) Pt.4:显式析构函数的问题及3种解决方案
当某一类型实现了`Drop`,在析构函数中无法将该类型的任何字段移出。因为在显式析构函数运行后,`drop()`仍会被调用,它接受`&mut self`,要求`self`的所有部分都没被移动原创 2025-02-24 07:52:51 · 807 阅读 · 0 评论 -
【Rust中级教程】2.7. API设计原则之灵活性(flexible) Pt.3:借用 vs. 拥有、`Cow`类型、可失败和阻塞的析构函数及解决办法
如果你的代码需要数据的所有权,那么就必须要存储拥有的数据。当你的代码拥有数据时,必须让调用者提供拥有的数据,而不是引用或克隆。这样就可以让调用者控制内存分配,并且可以清楚地看到使用相关接口的成本。原创 2025-02-23 09:13:35 · 935 阅读 · 0 评论 -
【Rust中级教程】2.6. API设计原则之灵活性(flexible) Pt.2:对象安全(Object Safety)、对象安全与API设计、trait的泛型方法与API设计
对象安全(Object Safety)是Rust中与**Trait 对象(Trait Object)** 相关的一个概念,它决定了某个 Trait 是否可以被动态分发(dynamic dispatch),即能否用作`dyn Trait`形式的Trait对象。原创 2025-02-23 09:12:25 · 1113 阅读 · 0 评论 -
【Rust中级教程】2.5. API设计原则之灵活性(flexible) Pt.1:代码的契约(Contract)、使用泛型参数(generic arguments)让接口更灵活
你写的代码里,不论是显式地还是隐式地,都包含了一种契约。契约一共有两个方面:契约是一种要求,它是代码使用的限制;契约是一种承诺,它是代码使用的保证。原创 2025-02-22 07:55:13 · 1025 阅读 · 0 评论 -
【Rust中级教程】2.4. API设计原则之不意外性(unsurprising) Pt.4:“人体工程学”的trait实现、包装类型(Wrapper Types)、`Borrow` trait
对于迭代器来说,如果某个类型可以迭代,那么它的引用也应该添加相应的trait实现。也就是说:**对于任何可迭代的类型,考虑为`&MyType`和`&mut MyType`实现`IntoIterator`**。这样在循环中我们就可以直接使用借用的实例,符合用户预期。原创 2025-02-22 07:53:29 · 881 阅读 · 0 评论 -
【Rust中级教程】2.3. API设计原则之不意外性(unsurprising) Pt.3:实现serde下的Serialize和Deserialize trait、不建议实现Copy trait
serde是Rust中用于序列化(serialization)和反序列化(deserialization)的核心库:序列化(Serialization):把Rust结构体或枚举转换为JSON、YAML等格式的字符串或二进制数据。反序列化(Deserialization):从JSON、YAML等格式的字符串或二进制数据解析回Rust结构体或枚举。原创 2025-02-21 07:29:01 · 1146 阅读 · 0 评论 -
【Rust中级教程】2.2. API设计原则之不意外性(unsurprising) Pt.2:实现Clone、Default、PartialEq、PartialOrd、Hash、Eq和Ord
Rust的`Clone` trait允许实现者通过`clone`方法显式创建自身的**深拷贝**,以区别于`Copy` trait提供的按值复制。`PartialEq`提供 `==` 和 `!=` 操作符支持,允许自定义类型进行部分相等性比较原创 2025-02-21 07:27:45 · 768 阅读 · 0 评论 -
【Rust中级教程】2.1. API设计原则之不意外性(unsurprising):命名的技巧、实现常用的trait(Debug、Send、Sync和Unpin)
不意外原则也叫做最少意外原则,它的意思是**你写的API应该尽可能的直观**。用户一看到接口就应该能猜出来是干什么用的。至少你写的接口不应该让人感到意外。**它的核心思想是贴近用户已经知道的东西**,这样用户就不需要重学概念。原创 2025-02-20 07:32:25 · 1101 阅读 · 0 评论 -
【Rust中级教程】1.17. 孤儿规则与连贯性(一致性):泛实现(Blanket Implementation)、覆盖实现(Covered Implementation)
连贯性(或者叫一致性)是指对于给定的类型和方法,只会有一个正确的选择,用于该方法对该类型的实现。孤儿规则(orphan rule)指的是只要trait或者类型在本地的crate,那就可以为该类型实现该trait。泛实现(Blanket Implementation),又叫通用实现,它指的是Rust允许为所有符合某个trait约束的类型提供默认实现。原创 2025-02-20 07:30:33 · 748 阅读 · 0 评论 -
【Rust中级教程】1.16. 泛型trait:泛型(类型参数)trait、关联类型trait
泛型trait要求必须指定所有的泛型类型参数,并重复写这些参数的约束(bounds)。这么写维护起来会难一些。比如说如果添加泛型类型参数到某个trait,该trait的所有实现者都必须更新代码。原创 2025-02-19 07:42:31 · 1067 阅读 · 0 评论 -
【Rust中级教程】1.15. Trait bounds(Trait 约束)的编译与分派
静态分发:编译器会把实例的泛型参数使用具体类型替换。动态分发(dynamic dispatch)使代码可以调用泛型类型上的trait方法,而无需知道具体的类型。原创 2025-02-19 07:40:52 · 1019 阅读 · 0 评论 -
【Rust中级教程】1.14. 内存中的类型 Pt.2:动态大小的类型和宽指针(Wide Pointer)、无填充内存布局、给特定字段或类型更大的对齐、复杂类型的内存表示、`repr(Rust)`
`repr(Rust)`去掉了该限制和其它一些小限制:对恰好具有相同字段的类型确定性字段排序。如果有两个不同类型的字段相同,字段类型也相同,定义顺序也一样,`repr(Rust)`不能保证这两者有相同的内存布局。原创 2025-02-18 08:55:47 · 888 阅读 · 0 评论 -
【Rust中级教程】1.13. 内存中的类型 Pt.1:对齐(Alignment)、布局(Layout)、`repr`属性
对齐(Alignment)决定了类型的字节可以被存储在哪里。类型的布局(Layout)指的是编译器决定这个类型在内存上如何表示。Rust提供了`repr`属性(attribute):它可以添加到你类型的定义上,来请求特定的类型表示。原创 2025-02-18 08:54:36 · 897 阅读 · 0 评论 -
【Rust中级教程】1.12. 生命周期(进阶) Pt.2:生命周期变型、协变、不变、逆变
变型(Variance)是Rust类型系统中的一个概念,它描述了泛型参数(特别是生命周期参数)在类型层次结构中的继承关系。所有类型都有变型,每个类型所对应的变型定义了哪些类似类型可以用在该类型的位置上。原创 2025-02-17 11:55:27 · 1177 阅读 · 0 评论 -
【Rust中级教程】1.11. 生命周期(进阶) Pt.1:回顾、借用检查器、泛型生命周期
对某个变量取得引用时生命周期开始,当变量移动或离开作用域时生命周期结束。也就是对于某个引用来说,它必须保持合法的一个代码区域的名称。原创 2025-02-17 08:06:32 · 1138 阅读 · 0 评论 -
【Rust中级教程】1.10. 引用及内部可变性(简单回顾):引用、内部可变性、`Cell`类型及相关操作
引用就是带有附加合约的指针。Rust中一共有两种引用类型。一些类型提供了内部可变性,这些类型可以通过共享引用修改值。`Cell`类型来自于标准库,它通过不变量实现内部可变性。原创 2025-02-16 07:43:30 · 971 阅读 · 0 评论 -
【Rust中级教程】1.9. 所有权(简单回顾):所有权的核心思想、如何实现`Copy` trait、值的删除(丢弃)、值删除的顺序
Rust内存模型的核心思想是**所有值都只有一个所有者**。也就是说只有一个位置(通常是作用域来) 负责释放每个值。原创 2025-02-15 07:44:17 · 1022 阅读 · 0 评论 -
【Rust中级教程】1.7. 内存 Pt.5:堆内存vs.栈内存、虚拟内存、数据在RAM中展示的建议
在任何时刻,运行中的程序都会占据一部分的内存。*有时候程序需要更多的内存,就需要向操作系统请求,这就是动态内存分配(dynamic allocation)。*原创 2025-02-14 08:04:14 · 864 阅读 · 0 评论 -
【Rust中级教程】1.6. 内存 Pt.4:静态(static)内存与‘static生命周期标注
static内存实际上是一个统称,它指的是程序编译后的文件中几个密切相关的区域。当程序执行的时候,这些区域会自动加载到内存里。原创 2025-02-13 07:31:42 · 785 阅读 · 0 评论 -
【Rust中级教程】1.5. 内存 Pt.3:深入探究Rust堆内存底层实现
Heap允许你显示地分配连续的内存块。当这么做时,你就会得到一个指针,它指向内存开始的地方。原创 2025-02-12 07:18:33 · 1411 阅读 · 0 评论 -
【Rust中级教程】1.4. 内存 Pt.2:栈内存、栈帧(stack frame)、栈指针(stack pointer)
程序有很多的内存区域,并不都是在DRAM上的。三个比较重要的区域是栈内存stack、堆内存heap和静态内存staic。本篇文章带你搞清楚栈内存的底层实现。原创 2025-02-11 07:36:47 · 1648 阅读 · 0 评论 -
【Rust中级教程】1.3. 内存 Pt.1:各类概念的定义及变量的高级模型和低级模型
值会存储到一个地方(或者说这个地方可以容纳值),具体就是堆内存、栈内存或者其他地方。最常见的存储值的地方就是变量,它是*栈内存*上一个被命名的槽(用于存储值)。原创 2025-02-10 07:32:10 · 1124 阅读 · 0 评论 -
【Rust中级教程】1.2. 指针概览(下):原始指针及Rust里的各类指针
unsafe Rust提供了两种类似于引用的新型指针,它们叫做*原始指针*或者*裸指针*,英文是raw pointer。原创 2025-02-09 13:17:38 · 1144 阅读 · 0 评论 -
【Rust中级教程】1.1. 指针概览(上):什么是指针、指针和引用的区别
数据在物理内存中(Random Access Memory,简称RAM)是分散着存储的。而为了找到具体的数据,我们需要一个检索系统,叫做地址空间原创 2025-02-08 09:00:16 · 1138 阅读 · 0 评论 -
【Rust中级教程】0. 引言
在Rust中级教程中我们将围绕“*类型*”和“*接口设计建议*”两个主题展开,每个主题各有十多二十篇文章,虽然没有Rust初级教程的那么多,但是比初级教程的文章难,需要多一些时间消化。原创 2025-02-08 08:55:07 · 411 阅读 · 0 评论