Merge pull request #23 from sunface/main

sync
pull/1126/head
Rustln 2 years ago committed by GitHub
commit 534a96ceb8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -10,17 +10,12 @@
[![](https://img.shields.io/github/issues-pr-closed-raw/sunface/rust-course.svg?style=flat)](https://github.com/sunface/rust-course/issues)
[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/ines/spacy-course/master)
<!-- <a href="https://www.zhihu.com/column/c_1452781034895446017">
<img alt="Sunface | 知乎" height="20px" width="20px" src="https://github.com/sunface/rust-course/blob/main/assets/zhihu.jpg">
</a> -->
</div>
## 教程简介
- 在线阅读: https://course.rs
@ -29,7 +24,7 @@
- **深入度**,在基础教学的同时,提供了深入剖析。浅尝辄止并不能让我们站上紫禁之巅
- **专题内容**,将 Rust 高级内容通过专题的形式一一呈现内容内聚性极强例如性能优化、手把手实现链表、Cargo和Tokio使用指南、async异步编程、标准库解析、WASM等等
- **专题内容**,将 Rust 高级内容通过专题的形式一一呈现内容内聚性极强例如性能优化、手把手实现链表、Cargo Tokio 使用指南、async 异步编程、标准库解析、WASM 等等
- **内容索引**,作为一本工具书,优秀的索引能力非常重要,遗忘不可怕,找不到才可怕
@ -37,11 +32,10 @@
- **[Cookbook](https://rusty.rs)**,涵盖多个应用场景的实战代码片段,程序员上网查询文件操作、正则解析、数据库操作是常事,没有人能记住所有代码,而 Cookbook 可解君忧Ctrl + C/V 走天下
- **[配套练习题](https://github.com/sunface/rust-by-practice)**,像学习一门大学课程一样学习 Rust 是一种什么感觉?*Rust语言圣经 + Rust语言实战* 双剑合璧,给你最极致的学习体验
- **[配套练习题](https://github.com/sunface/rust-by-practice)**,像学习一门大学课程一样学习 Rust 是一种什么感觉?_Rust 语言圣经 + Rust 语言实战_ 双剑合璧,给你最极致的学习体验
总之在写作过程中我们始终铭记初心:为中国用户打造一门**全面的、深入的、持续更新的** Rust 教程。 新手用来入门,老手用来提高,高手用来提升生产力。
## 🏅 贡献者
非常感谢本教程的[所有贡献者](https://github.com/sunface/rust-course/graphs/contributors),正是有了你们,才有了现在的高质量 Rust 教程!
@ -49,6 +43,7 @@
<br />
**🏆 贡献榜前三**(根据难易度、贡献次数、活跃度综合评定):
<table>
<tr>
<td align="center">
@ -66,10 +61,10 @@
</a>
</td>
<td align="center">
<a href="https://github.com/JesseAtSZ">
<img src="https://avatars.githubusercontent.com/u/35264598?v=4?s=100" width="160px" alt=""/>
<a href="https://github.com/zongzi531">
<img src="https://avatars.githubusercontent.com/u/22429236?v=4?s=100" width="160px" alt=""/>
<br />
<sub><b>JesseAtSZ 🥉</b></sub>
<sub><b>zongzi531 🥉</b></sub>
</a>
</td>
</tr>
@ -78,13 +73,14 @@
<br />
🏅 核心贡献者:
<table>
<tr>
<td align="center">
<a href="https://github.com/zongzi531">
<img src="https://avatars.githubusercontent.com/u/22429236?v=4?s=100" width="100px" alt=""/>
<a href="https://github.com/JesseAtSZ">
<img src="https://avatars.githubusercontent.com/u/35264598?v=4?s=100" width="100px" alt=""/>
<br />
<sub><b>zongzi531</b></sub>
<sub><b>JesseAtSZ</b></sub>
</a>
</td>
<td align="center">
@ -111,10 +107,9 @@
</tr>
</table>
## 创作感悟
截至目前Rust语言圣经已写了 170 余章110 余万字,历经 800 多个小时,每一个章节都是手动写就,没有任何机翻和质量上的妥协( 相信深入阅读过的读者都能体会到这一点 )。
截至目前Rust 语言圣经已写了 170 余章110 余万字,历经 800 多个小时,每一个章节都是手动写就,没有任何机翻和质量上的妥协( 相信深入阅读过的读者都能体会到这一点 )。
曾经有读者问过 "这么好的书为何要开源,而不是出版?",原因很简单:**只有完全开源才能完美地呈现出我想要的教学效果**。
@ -128,12 +123,10 @@
最后,能通过开源在茫茫人海中与大家相识,这感觉真好 :D
## 开源协议
在开源版权上,我们选择了 [No License](https://www.google.com.hk/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwigkv-KtMT0AhXFdXAKHdI4BCcQFnoECAQQAw&url=https%3A%2F%2Fchoosealicense.com%2Fno-permission%2F&usg=AOvVaw3M2Q4IbdhnpJ2K71TF7SPB),这意味着读者可以随意的 fork 和阅读,但是**不能私下修改后再包装分发**,如果有这方面的需求,请联系我们,望理解。
## 借鉴的书籍
站在巨人的肩膀上,能帮我们看的更远,特此感谢以下巨人:
@ -145,12 +138,10 @@
因为它们绝大部分是支持 APACHE + MIT 双协议的,因此我们选择了遵循其中的 MIT 协议,并在这里统一对借鉴的书籍进行说明。
## 社区 & 读者交流
- 知乎: [孙飞 Sunface](https://www.zhihu.com/people/iSunface)
- QQ群 `1009730433`,用于日常技术交流
- QQ `1009730433`,用于日常技术交流
- 微信公众号: 扫描下面的二维码关注公众号 `Rust语言中文网`
<img src="https://github.com/sunface/rust-course/blob/main/assets/studyrust公众号.png?raw=true" />

@ -60,10 +60,10 @@ Rust语言真的好连续七年成为全世界最受欢迎的语言、没有G
</a>
</td>
<td align="center" width="25%">
<a href="https://github.com/JesseAtSZ">
<img src="https://avatars.githubusercontent.com/u/35264598?v=4?s=100" alt=""/>
<a href="https://github.com/zongzi531">
<img src="https://avatars.githubusercontent.com/u/22429236?v=4?s=100" alt=""/>
<br />
<sub><b>JesseAtSZ 🥉</b></sub>
<sub><b>zongzi531</b></sub>
</a>
</td>
</tr>
@ -75,10 +75,10 @@ Rust语言真的好连续七年成为全世界最受欢迎的语言、没有G
<table>
<tr>
<td align="center" width="25%">
<a href="https://github.com/zongzi531">
<img src="https://avatars.githubusercontent.com/u/22429236?v=4?s=100" alt=""/>
<a href="https://github.com/JesseAtSZ">
<img src="https://avatars.githubusercontent.com/u/35264598?v=4?s=100" alt=""/>
<br />
<sub><b>zongzi531</b></sub>
<sub><b>JesseAtSZ 🥉</b></sub>
</a>
</td>
<td align="center" width="25%">

@ -506,7 +506,7 @@ Mutex { data: true, poisoned: false, .. }
在多线程中,另一个重要的概念就是信号量,使用它可以让我们精准的控制当前正在运行的任务最大数量。想象一下,当一个新游戏刚开服时(有些较火的老游戏也会,比如`wow`),往往会控制游戏内玩家的同时在线数,一旦超过某个临界值,就开始进行排队进服。而在实际使用中,也有很多时候,我们需要通过信号量来控制最大并发数,防止服务器资源被撑爆。
本来 Rust 在标准库中有提供一个[信号量实现](https://doc.rust-lang.org/1.8.0/std/sync/struct.Semaphore.html), 但是由于各种原因这个库现在已经不再推荐使用了,因此我们推荐使用`tokio`中提供的`Semaphone`实现: [`tokio::sync::Semaphore`](https://github.com/tokio-rs/tokio/blob/master/tokio/src/sync/semaphore.rs)。
本来 Rust 在标准库中有提供一个[信号量实现](https://doc.rust-lang.org/1.8.0/std/sync/struct.Semaphore.html), 但是由于各种原因这个库现在已经不再推荐使用了,因此我们推荐使用`tokio`中提供的`Semaphore`实现: [`tokio::sync::Semaphore`](https://github.com/tokio-rs/tokio/blob/master/tokio/src/sync/semaphore.rs)。
```rust
use std::sync::Arc;

@ -88,7 +88,7 @@ fn generic<T: Sized>(t: T) {
}
```
在上面Rust 自动添加的特征约束 `T: Sized`,表示泛型函数只能用于一切实现了 `Sized` 特征的类型上,而**所有在编译时就能知道其大小的类型,都会自动实现 `Sized` 特征**,例如。。。。也没啥好例如的,你能想到的几乎类型都实现了 `Sized` 特征,除了上面那个坑坑的 `str`,哦,还有特征。
在上面Rust 自动添加的特征约束 `T: Sized`,表示泛型函数只能用于一切实现了 `Sized` 特征的类型上,而**所有在编译时就能知道其大小的类型,都会自动实现 `Sized` 特征**,例如。。。。也没啥好例如的,你能想到的几乎所有类型都实现了 `Sized` 特征,除了上面那个坑坑的 `str`,哦,还有特征。
**每一个特征都是一个可以通过名称来引用的动态大小类型**。因此如果想把特征作为具体的类型来传递给函数,你必须将其转换成一个特征对象:诸如 `&dyn Trait` 或者 `Box<dyn Trait>` (还有 `Rc<dyn Trait>`)这些引用类型。

@ -1,84 +1,93 @@
# 「Rust 语言周刊」 第 16 期 · 2022-06-24
Rust语言周刊精选全世界过去一周的优秀文章、新闻、开源项目和语言动态。
# 「Rust 语言周刊」 第 17 期 · 2022-07-15
Rust语言周刊精选全世界过去一周(或者几周)的优秀文章、新闻、开源项目和语言动态。
本周刊由 RustCn 倾情打造,其中, `[Zh]` 标识的中文资料由 Rust 翻译计划提供,并且原始的 Markdown 文档已[全部开源](https://github.com/rustlang-cn/rustt),欢迎大家阅读和订阅。
> RustCnhttps://hirust.cn, 公众号: Rust语言中文网
<img src="https://pica.zhimg.com/80/v2-2826dfca738cdc1795e77d12eb269906_1440w.png">
<h5 align="center">题图: Tauri 发布 1.0 版本</h5>
## 官方新闻
1、[首期 Rust 基金会的赞助名单已经出炉](https://foundation.rust-lang.org/news/2022-06-14-community-grants-program-awards-announcement/)
1、[Zh] [Rust 发布 1.62 版本](https://course.rs/appendix/rust-versions/1.62.html)
按照目前的计划,基金会每年开放两次申请,每次 20 万美元的总额( 估计会逐年增加 ),大致授予[合作伙伴](https://foundation.rust-lang.org/news/2022-06-14-community-grants-program-awards-announcement/#fellowship-awards)和[个人项目](https://foundation.rust-lang.org/news/2022-06-14-community-grants-program-awards-announcement/#individual-project-grant-awards)两个方向
如果大家期待 Rust 像其它语言一样每一个新版本都带来大量新特性那你们可要失望了1.62 的更新内容相当少,甚至不如某些语言一个 minor 版本的更新力度,但**错不在 Rust**,建议大家了解下 Rust 的[版本发布流程](https://course.rs/appendix/rust-version.html),就明白其中的弯弯绕绕了
下次的申请开放大概在 10 月份左右,强烈建议有能力的都去试试,万一申请下来,几千美元也是很香的 :)
## 开源项目
## 精选文章
1、[基于 Rust 的操作系统训练营](https://github.com/LearningOS/rust-based-os-comp2022)
1、[Zh] [用 Rust 从 0 到 1 实现一个最简化的 KV 存储引擎](https://blog.csdn.net/qq_36456827/article/details/125304612)
该训练营有一个配套教程,将带大家从零开始使用 Rust 编写 RISC-V 架构的 类 Unix 内核 。
这种有讲有练的干货真的不多( 大部分人貌似都更喜欢做一些偏软货的东东,包括我自己 :P ),本文不仅内容质量高,而且还随文附送一个相当不错的 DB demo 实现,非常值得阅读和学习!
我自己也做开源,深知这件事会占用多少的时间和精力,甚至还会遭人非议,而我仅仅是写写书,跟作者这种大佬一比,差距就太大了... Respect!
2、[智商提升了一岁的 Rust 编译检查器](https://jackh726.github.io/rust/2022/06/10/nll-stabilization.html)
2、[Tauri 发布 1.0 版本](https://tauri.app/blog/tauri_1_0/)
当你好奇的看到这里时,和我一样,你被作者的标题忽悠了,其实是 Rust 编译检查器在最新版本中会默认开启所有的功能。不过在文章中,还讲到了很多生命周期错误提示的最新变动以及未来的展望,总算没白来了 :D
虽然 Tauri 很有名,但是为防有同学不知道背景,还是简单介绍下:它是一款跨平台的桌面应用开发框架,虽然内核是使用 Rust 开发,但是开发者可以使用自己喜欢的前端框架( `react`, `vue`, `vite` )来构建自己的用户界面,最终编译生成一个可执行的二进制文件,方便在各个不同的操作系统间分发运行。总之,你可以将 Tauri 当作是理念更先进的 Electron.js 。
3、[大佬来找茬系列之教学明星项目 mini-redis](https://smallcultfollowing.com/babysteps/blog/2022/06/13/async-cancellation-a-case-study-of-pub-sub-in-mini-redis/)
言归正传,在历经 1 年多的时间后Tauri 终于发布了 1.0 版本,这也标志着它已经可以在生产环境正式使用,并且目前来看,官方文档还算可以,甚至还提供了[中文文档](https://tauri.app/zh/v1/guides/getting-started/prerequisites),除此之外,我还发现了一个[宝藏教学系列](https://zhuanlan.zhihu.com/p/539708101),值得一读。
一般来说,在社区中推荐一个新手学习项目, [`mini-redis`](https://github.com/tokio-rs/mini-redis) 往往是首选,它拥有高质量且简洁的代码实现、清晰完善的文档以及对异步编程保姆式的引导讲解,总之非常棒。
3、[lettre 发布 0.1.0 版本](https://lettre.rs/post/lettre-0-10/)
但是它没有缺点吗这不Baby steps 大佬出手了,干货满满,强烈推荐阅读!
`lettre` 是一个现代化的邮件发送库,它简单易用、安全可靠,但是需要注意,它的目标**不是支持所有的邮件 RFC 标准**,因此在你有特殊需求时,可能会需要自己动手,丰衣足食。
4、[如何让 Rust 项目发生内存泄漏甚至崩溃?](https://fly.io/blog/rust-memory-leak/)
该库目前已被多个项目使用,包括大名鼎鼎的 `crates.io`
别开枪,是友军!事实上,这篇文章讲的是如何修复 Rust 项目的内存泄漏问题,具体的项目是 `fly.io` 公司的代理服务,该代理会将来自世界各地的用户请求路由到最适合的虚拟机中( 虚拟机分布在全世界 21 个地区 )。
4、[workers-rs: 使用 Rust + WebAssembly 实现 Cloudflare 的 Workers](https://github.com/cloudflare/workers-rs)
5、[使用自建的 prelude.rs 来简化 Rust 项目的依赖引入](https://justinwoodring.com/blog/tidy-your-rust-imports-with-prelude/)
Cloudflare 已经成为全世界最大的 DNS 服务商,而且它的业务不仅仅是 DNS目前云计算方面也进行的如火如荼。CF 最大的优势不仅仅在于 DNS 的快速和稳定,还在于它提供了多种方式来扩展你的 DNS 使用,例如你可以使用 Rust 来变成它的 worker。
Rust 项目大了后,一个不得不面对的问题就是:该如何处理每个文件中都需要导入的重复依赖,例如:
为了便于有需要的同学进一步学习该如何使用,这里还有一篇[实战文章](https://logankeenan.com/posts/running-a-rust-server-in-a-cloudflare-worker/),值得一看。
```rust
use crate::models::clubs_md::{Club, NewClub, ClubDetails};
use crate::models::users_md::{User, UserDetails, NewUser, Admin};
use crate::models::club_members_md::{MembershipStatus, ClubMember, NewClubMember};
use crate::Db;
```
6、[使用 Rust 来测试 NVDIA 的 GPU 性能](https://simbleau.github.io/blog/gpu-profiling-with-rust/)
## 精选文章
在目前的 CPU、GPU 跑分领域Rust 还是小兵之姿,但将军的梦想还是要有的。这篇文章中,作者将使用 NVDIA 的工具扩展 SDK 来开发基于 Rust 的 GPU 和 CPU 跑分工具,喜欢猎奇的同学不容错过。
1、[过程宏揭秘 II](https://blog.jetbrains.com/rust/2022/07/07/procedural-macros-under-the-hood-part-ii/)
想要了解过程宏是如何编译、怎么跟 IDE 互动的吗?来看看这个系列的文章,作者来自 Intellij Rust 插件开发组,之前还给 RustCon 分享过,干货满满。
## 开源项目
本文是系列文章中的第二篇,第一篇见[这里](https://blog.jetbrains.com/rust/2022/03/18/procedural-macros-under-the-hood-part-i/)。
2、[youtube][有字幕] [AWS 在构建 Rust SDK 方面的实践](https://www.youtube.com/watch?v=N0XMjokwTIM)
如果没有亚马逊这几年对 Rust 的大力(肆)支(鼓)持(吹)Rust 也不会走到今天这个地步。出于敬意,放上这个视频,事实上,里面更多的是对自己产品的宣传 = = 特别是第一部分,大家可以跳着看,一些关于底层的讲解还是值得一看的。
3、[Zh] [在 GCC 13 中,大家可能将看到 Rust 的身影](https://www.oschina.net/news/202630/gcc-rust-approved-by-gcc-steering-committee)
目前来说Rust 的编译器实现是基于 LLVM 的,而我们可能很快将看到基于 GCC 的实现,与 LLVM 不同,新的编译器将能获得 GCC 内部优化通道的所有访问权,同时带来更多的目标平台的支持,以及享受 GCC 众多的插件生态。
该项目已经历时多年(从 Rust 0.9 版本开始),我一度怀疑可能永远都无法看到它的身影,没想到现在突然官宣了,但是项目依然还处于早期阶段,当前的目标是在 GCC 13 中提供测试级别的支持。
1、 [lurk: 使用 Rust 重新实现 strace](https://jakobwaibel.com/2022/06/06/ptrace/)
再加上 Rust 即将在 Linux 5.20 中出现,可以预料, Rust 的未来将更加美好,大家一起期待吧!
目前项目还较为早期,但是关于项目的愿景,作者描述的较为清晰,这种项目一般都是值得期待并能产生结果的。
4、[C++ 大战 Rust 系列:可变性和所有权](https://www.tangramvision.com/blog/c-rust-interior-mutability-moving-and-ownership)
2、[error-stack: 一个全新的 Rust 错误处理库](https://hash.dev/blog/announcing-error-stack)
虽然 Rust 将所有权发扬光大,但是咱不能说 Rust 发明了所有权毕竟众所周知Rust 语言是借鉴大师 :P
该库支持上下文感知和任意用户数据的关联。事实上,这种类型的开源项目往往都来源于一个团队在实际项目中遇到的痛点,因此工程性适用性会非常强。总之,以我个人的经验,不以 star 论英雄,还是看看是 `谁` 开源了 `什么` 项目以及适不适合 `你` 的使用场景,很多低星项目其实是非常优秀和成熟的,只不过没有得到应有的曝光度。
在这篇文章中,作者将介绍 C++ 和 Rust 在实现所有权、可变性方面的不同设计哲学,以及标准库、编译器层面的支持
3、[打遍 playground 无敌手的 Rust Explorer](https://www.rustexplorer.com/b/about)
5、[Rust 错误介绍,比你想要的更多](https://www.shuttle.rs/blog/2022/06/30/error-handling)
这个项目真的非常吸引我,不知道大家对于在线代码运行的期许是什么,对我而言,能够运行各种代码绝对是最大的亮点,而这个项目支持 10000 个三方依赖库(crates.io 上的 top 10000)
文章不错,标题也不错! 虽然你想要的错误处理几乎都可以在 `https://course.rs` 上找到,但是这篇文章依然值得一看
不是 100也不是 1000而是 10000基本上这意味着几乎所有代码片段都可以在这里运行了也意味着我的 `practice.rs` 项目可以进一步扩展Bingo!
6、[Youtube][有字幕] [为何你的 Rust 编译这么慢?](https://www.youtube.com/watch?v=pMiqRM5ooNw)
4、[clap 3.2 发布](https://epage.github.io/blog/2022/06/clap-32-last-call-before-40/)
视频质量自然非常高,从各个方面介绍了该如何提升 Rust 的编译速度,干货满满,强烈推荐。
看起来只是一个小版本,但是它可是 4.0 大版本的预演,因此新增了两种 API 构建方式。
但...我的天,我真的佩服作者,就以 Rust 周刊举例吧,每次周刊基本都要花费我几个小时,那一个将近 3 个小时的干货视频,要准备多久?简直是卷王在世 :)
5、[c2rust 王者归来](https://immunant.com/blog/2022/06/back/)
甚至有人评论到:这个是一个 AMSR 视频...
这个项目对于 Rust 的生态而言太太太重要了要进一步扩大自己的份额C 语言就是绕不过的高山,而重写旧项目在大多数时候显然都是不现实的,因此 `c2rust` 才会有这么高的呼声,只不过之前因为核心作者的原因,项目几乎不怎么活跃了,还好现在 `immunant` 公司接过了大旗。
要我说,这种底层类型的大型开源项目要做得好,还是得背靠大树,例如之前的 [`cc`](https://github.com/rust-lang/cc-rs/issues/663) 项目就是从 `alex` 个人名下转到了 `rust` 官方组织下,最终又焕发了第二春。
7、[Rust中的再借用](https://haibane-tenshi.github.io/rust-reborrowing/)
6、[mold 发布 0.3 版本](https://github.com/rui314/mold)
大家都知道 Rust 中的生命周期很难那你们谈谈对借用的印象难吗我猜大多数人会说不难。其实不然Rust 中的借用并不仅仅是书上介绍的那些,例如**再借用(reborrowing)**,你听说过吗?
mold 是一个用 Rust 写的链接器,它的性能比 LLVM 的 lld 链接器快好几倍,目标是通过降低编译时间来让 Rust 项目的开发闭环周期大幅提速。以下是性能对比图:
8、[我很强,但 Rust 更强](https://blog.polybdenum.com/2022/06/25/an-unfortunate-experience-with-rust.html)
<img src="https://pic1.zhimg.com/80/v2-62f5d64e110fb3c6a9af669ccb1357f7_1440w.png" />
作者说他对于 Rust 极其有经验,但是就算这样的高手,依然避免不了被 Rust 所教育,你问怎么个教育法?当然是跟编译器搏斗咯。
其实,从我个人而言,非常推荐大家看看这类文章,那些关于 Rust 如何成功的营销文,爽则爽矣,对于技术却无多大帮助。而这种错误实践类的文章,却能帮助我们少走很多弯路!

Loading…
Cancel
Save