
Rust自学
文章平均质量分 87
SomeB1oody
会努力更新的,保证每天必更一到两篇,不更更多是因为流量券一天最多就2篇
展开
-
【Rust自学】20.4. 结语:Rust学习一阶段完成+附录
Rust初级学习之旅终于完成了!恭喜!包括这篇文章,我们使用了110篇文章来学习Rust。原创 2025-02-07 07:03:23 · 632 阅读 · 0 评论 -
【Rust自学】20.3. 最后的项目:Web服务器的优雅停机与清理
在上一篇文章中我们完成了多线程Web服务器的构建,但是它的仍然有一些可以改进之处,这篇文章我们就来完善代码。注意:本文衔接于上一篇文章 20.2. 最后的项目:多线程Web服务器。如果你想要详细了解从零开始的构建Web服务器过程,请阅读完20章的所有文章。原创 2025-02-06 10:55:24 · 613 阅读 · 0 评论 -
【Rust自学】20.2. 最后的项目:多线程Web服务器
我们在上一篇文章中写了一个简单的本地服务器,但是这个服务器是单线的,也就是说请求一个一个进去之后我们得一个一个地处理,如果某个请求处理得慢,那后面的都得排队等着。这种单线程外部服务器的性能是非常差的。原创 2025-02-05 09:32:22 · 1600 阅读 · 0 评论 -
【Rust自学】16.4. 通过Send和Sync trait来扩展并发
Rust语言本身的并发特性较少,目前所提及的并发特性都来自于标准库,而不是语言本身。其实无需局限于标准库的开发,可以自己实现并发。原创 2025-01-29 11:13:59 · 456 阅读 · 0 评论 -
【Rust自学】20.1. 最后的项目:单线程Web服务器
Web 服务器涉及的两个主要协议是*超文本传输协议*(Hypertext Transfer Protocol,简称HTTP)和*传输控制协议*(Transmission Control Protocol,简称TCP)。这两种协议都是*请求-响应*协议,即*客户端*发起请求,然后*服务器*监听请求并向客户端提供响应。这些请求和响应的内容由协议定义。原创 2025-02-04 10:47:26 · 1351 阅读 · 0 评论 -
【Rust自学】19.5. 高级类型
使用newtype模式实现类型安全和抽象、类型别名、never类型、动态大小和和`Sized` trait原创 2025-02-03 08:17:07 · 1162 阅读 · 0 评论 -
【Rust自学】19.4. 宏(macro)
宏(macro)在Rust里指的是一组相关特性的集合称谓。从本质上来讲,宏是用来编写可以生成其它代码的代码,也就是所谓的*元编程(metaprogramming)*。原创 2025-02-03 08:12:19 · 1215 阅读 · 0 评论 -
【Rust自学】19.3. 高级函数和闭包
我们之前讲过如何把闭包传给函数,而实际上我们还可以把函数传递给函数。在传递过程中,函数会被强制转换为`fn`类型,也就是函数指针(function pointer)。原创 2025-02-02 10:19:17 · 1063 阅读 · 0 评论 -
【Rust自学】19.2. 高级trait:关联类型、默认泛型参数和运算符重载、完全限定语法、supertrait和newtype
我们首先在第10章的10.3. trait Pt.1:trait的定义、约束与实现 和 10.4. trait Pt.2:trait作为参数和返回类型、trait bound 中介绍了trait,但我们没有讨论更高级的细节。现在我们来深入了解原创 2025-02-02 10:17:32 · 1158 阅读 · 0 评论 -
【Rust自学】19.1. 摆脱安全性限制的unsafe Rust
到目前为止我们讨论的所有代码都在编译时强制执行Rust的内存安全保证。然而,Rust内部隐藏着第二种语言,它不强制执行这些内存安全保证,被称为unsafe Rust。它和普通Rust一样,但给了我们额外的“超能力”。原创 2025-02-01 10:34:49 · 1675 阅读 · 0 评论 -
【Rust自学】18.3. 模式(匹配)的语法
匹配字面值、匹配命名变量、多重模式、使用`..=`来匹配某个范围的值、解构以分解值、使用`match guards`(`match`守卫)来提供额外的条件、`@`绑定原创 2025-02-01 10:32:02 · 1189 阅读 · 0 评论 -
【Rust自学】18.2. 可辩驳性:模式是否会无法匹配
模式有两种形式:可辩驳的(可失败的)、无可辩驳的(不可失败的),可以把它理解为不会失败的,怎么写都会成功原创 2025-01-31 08:03:40 · 659 阅读 · 0 评论 -
【Rust自学】18.1. 能用到模式(匹配)的地方
*模式(pattern)* 是Rust里的一种特殊的语法,用于匹配复杂和简单类型的结构。原创 2025-01-31 08:02:14 · 988 阅读 · 0 评论 -
【Rust自学】17.3. 实现面向对象的设计模式
*状态模式(state pattern)* 是一种面向对象设计模式,指的是一个值拥有的内部状态由数个*状态对象(state object)* 表达而成,而值的行为随着内部状态的改变而改变。原创 2025-01-30 10:29:55 · 1125 阅读 · 0 评论 -
【Rust自学】17.2. 使用trait对象来存储不同值的类型
Rust并没有提供继承功能,所以想使用Rust来构建GUI工具就得使用其他方法——为共有行为定义一个trait原创 2025-01-30 10:27:39 · 1124 阅读 · 0 评论 -
【Rust自学】17.1. Rust的面向对象的编程特性
基于某些定义,Rust是面向对象的:`struct`、`enum`包含数据,`impl`块为之提供了方法。但在Rust里带有方法的`struct`和`enum`并没有称之为对象。原创 2025-01-29 11:14:25 · 947 阅读 · 0 评论 -
【Rust自学】16.3. 共享状态的并发
上一篇文章就是使用通信的方式来实现并发的。这一篇文章讲一下如何使用**共享内存**的方式来实现并发。Go语言不建议使用这种方式,Rust支持通过共享状态来实现并发。原创 2025-01-28 08:05:32 · 1398 阅读 · 0 评论 -
【Rust自学】16.2. 使用消息传递来跨线程传递数据
有一种很流行而且能保证安全并发的技术(或者叫机制)叫做**消息传递**。在这种机制里,线程(或Actor)通过彼此间发送消息(数据)来进行通讯。原创 2025-01-28 08:03:05 · 1386 阅读 · 0 评论 -
【Rust自学】15.6. RefCell与内部可变性:“摆脱”安全性限制
内部可变性(interior mutability)是Rust的设计模式之一,它允许程序员在只持有不可变引用的前提下对数据进行修改。原创 2025-01-27 08:03:57 · 1580 阅读 · 0 评论 -
【Rust自学】15.7. 循环引用导致内存泄漏
Rust极高的安全性使得内存泄漏**很难出现**,但**并不是完全不可能**。例如使用`Rc<T>`和`RefCell<T>`就可能创造出循环引用,造成内存泄漏:每个指针的引用计数都不会减少到0,值也不会被清理。原创 2025-01-27 08:04:16 · 1437 阅读 · 0 评论 -
【Rust自学】15.5. Rc<T>:引用计数智能指针与共享所有权
为了支持多重所有权,Rust提供了`Rc<T>`类型,`Rc`是Reference counting(引用计数)的简写,这个类型会在实例的内部维护一个用于记录值的引用次数的计数器,从而判断这个值是否仍在使用。如果这个值的引用数量为0,那么这个值就可以被安全地清理掉了,而且不会触发引用实效的问题。原创 2025-01-26 09:44:17 · 1250 阅读 · 0 评论 -
【Rust自学】15.4. Drop trait:告别手动清理,释放即安全
在某些语言中(比如C/C++),对于某些类型,程序员每次使用完这些类型的实例时都必须写代码来释放内存或资源。如果忘记了,系统可能会过载并崩溃。在Rust中,程序员可以指定每当值超出范围时运行特定的代码,编译器将自动插入此代码。原创 2025-01-26 09:41:17 · 753 阅读 · 0 评论 -
【Rust自学】15.3. Deref trait Pt.2:隐式解引用转化与可变性
隐式解引用转化(Deref Coercion)是为函数和方法提供的一种便捷特性。它的原理是:*假如类型`T`实现了`Deref` trait,那么Deref Coercion可以把`T`的引用转化为`T`经过`Deref`操作后生成的引用。原创 2025-01-25 09:53:13 · 774 阅读 · 0 评论 -
【Rust自学】15.2. Deref trait Pt.1:什么是Deref、解引用运算符*与实现Deref trait
如果一个类型实现了`Deref` trait,那么它就使我们可以**自定义解引用运算符`*`的行为**。通过实现`Deref` trait,**智能指针可像常规引用一样来处理**。原创 2025-01-25 09:51:55 · 1124 阅读 · 0 评论 -
【Rust自学】15.1. 使用Box<T>智能指针来指向堆内存上的数据
`box<T>`可以被简单地理解为装箱,它是最简单的智能指针,允许你在堆内存上存储数据(而不是栈内存)。原创 2025-01-24 08:42:18 · 1010 阅读 · 0 评论 -
【Rust自学】15.0. 智能指针(序):什么是智能指针及Rust智能指针的特性
智能指针的概念并非Rust独有:它起源于C++,也存在于其他语言中。Rust的标准库中定义了各种智能指针,它们提供的功能超出了普通引用的能力。原创 2025-01-24 08:36:43 · 549 阅读 · 0 评论 -
【Rust自学】14.6. 安装二进制crate
通过`cargo_install`命令可以从crates.io安装二进制crate。 这并不是为了替换系统包,它应该是 Rust 开发人员安装其他人共享的工具的便捷方式。原创 2025-01-23 10:49:05 · 516 阅读 · 0 评论 -
【Rust自学】14.5. cargo工作空间(Workspace)
假如说我们构建了一个二进制crate,里面既有library又有库。随着项目规模不断增长,库crate可能不断变大。在这种情况下通常会把它拆为多个包,针对这种需求,Rust提供了cargo工作空间,也就是cargo workspace。原创 2025-01-23 10:46:37 · 962 阅读 · 0 评论 -
【Rust自学】14.4. 发布crate到crates.io
在发布任何 crate 之前,你需要在 crates.io并获取 API 令牌。为此,请访问crates.io主页并登录GitHub帐户(目前只支持GitHub帐户登录)。原创 2025-01-22 08:04:39 · 837 阅读 · 0 评论 -
【Rust自学】14.3. 使用pub use导出方便使用的API
开发者会把程序结构分为很多层,使用者想要找到这种深层结构中的某个类型就很费劲。对于这种问题,不需要开发者重新组织内部代码结构,使用pub use就可以重导出,创建一个于内部私有结构不同的对外公共结构。重导出这个操作会取得某个位置上的公共条目,并将其公开到另外一个位置,就好像它就定义在这个新的位置上。原创 2025-01-22 08:04:26 · 593 阅读 · 0 评论 -
【Rust自学】14.2. 文档注释以及发布crate
在crates.io上,我们不仅可以使用他人提供的`crate`,也可以发布自己的`crate`到供他人使用。非常类似于python的pip。原创 2025-01-21 08:07:53 · 1074 阅读 · 0 评论 -
【Rust自学】14.1. cargo:发布配置
release profile是发布配置的意思,它是一系列预定好的配置方案。而且它是可自定义的,我们可以自定义它,使用不同的配置,从而让程序员对代码的编译有更多的控制权。原创 2025-01-21 08:03:31 · 628 阅读 · 0 评论 -
【Rust自学】13.10. 性能对比:循环 vs. 迭代器
迭代器是Rust中的一种高层次的抽象,它在编译后生成的代码和我们手写的底层代码是几乎一样的产物。这套东西叫做零开销抽象(Zero-Cost Abstraction)原创 2025-01-20 08:13:45 · 1165 阅读 · 0 评论 -
【Rust自学】13.9. 使用闭包和迭代器改进IO项目
本篇文章会以第12章中的grep项目为例演示使用闭包和迭代器改进I/O项目原创 2025-01-20 08:10:32 · 1254 阅读 · 0 评论 -
【Rust自学】13.8. 迭代器 Pt.4:创建自定义迭代器
最主要的步骤就只有一步:提供`next`方法的实现。原创 2025-01-19 10:31:35 · 1004 阅读 · 0 评论 -
【Rust自学】13.7. 迭代器 Pt.3:使用闭包捕获环境配合迭代器的使用
`filter`方法是一个*迭代器适配器*,一般搭配闭包捕获环境来使用。原创 2025-01-19 10:29:58 · 400 阅读 · 0 评论 -
【Rust自学】13.6. 迭代器 Pt.2:消耗和产生迭代器的方法
Rust语言在设计过程中收到了很多语言的启发,而函数式编程对Rust产生了非常显著的影响。函数式编程通常包括通过将函数作为值传递给参数、从其他函数返回它们、将它们分配给变量以供以后执行等等。原创 2025-01-18 09:28:21 · 559 阅读 · 0 评论 -
【Rust自学】13.5. 迭代器 Pt.1:迭代器的定义、iterator trait和next方法
Rust语言在设计过程中收到了很多语言的启发,而函数式编程对Rust产生了非常显著的影响。函数式编程通常包括通过将函数作为值传递给参数、从其他函数返回它们、将它们分配给变量以供以后执行等等。原创 2025-01-18 09:28:07 · 1162 阅读 · 0 评论 -
【Rust自学】13.4. 闭包 Pt.4:使用闭包捕获环境
闭包有一项函数所不具备的功能:闭包可以访问定义它的作用域内的变量。但使用这个特性是有代价的,它会产生内存开销。闭包通过三种方法来从环境捕获值,这三种与函数获得参数的三种方法一样。原创 2025-01-17 10:44:15 · 985 阅读 · 0 评论 -
【Rust自学】13.3. 闭包 Pt.3:使用泛型参数和fn trait来存储闭包
闭包在实际使用中经常会被重复调用,造成不必要的耗时。对于这个问题,一个解决方案是把闭包的值赋给某个本地变量,这么写问题的是会造成一些代码的重复。所以这里更适合创建一个结构体,它持有闭包及其调用结果。原创 2025-01-17 10:42:29 · 1239 阅读 · 0 评论