diff --git a/src/SUMMARY.md b/src/SUMMARY.md
index 34c95ac5..aa845d73 100644
--- a/src/SUMMARY.md
+++ b/src/SUMMARY.md
@@ -1,14 +1,14 @@
# Rust 语言圣经
-[Rust语言圣经](about-book.md)
+[Rust 语言圣经](about-book.md)
[进入 Rust 编程世界](into-rust.md)
[快速查询入口](index-list.md)
---
-[一个社区](studyrust.md)
+[Rust 语言中文网](community.md)
[一本生锈的书](rusty-book.md)
[Rust 语言周刊](rust-weekly.md)
-[Rustt 翻译计划](rustt.md)
+[Rust 翻译计划( 代号 Rustt )](rustt.md)
# 快速开始
---
diff --git a/src/async-rust/tokio/getting-startted.md b/src/async-rust/tokio/getting-startted.md
index d2459f01..342a5ca9 100644
--- a/src/async-rust/tokio/getting-startted.md
+++ b/src/async-rust/tokio/getting-startted.md
@@ -1,8 +1,8 @@
# tokio 初印象
-又到了喜闻乐见的初印象环节,这个环节决定了你心中的那 24 盏灯最终是全绿还是全灭。
+又到了喜闻乐见的初印象环节,这个环节决定了你心中的那 24 盏灯最终是全亮还是全灭。
-在本文中,我们将看看本专题的学习目标、`tokio`该怎么引入以及如何实现一个 `Hello Tokio` 项目,最终留灯还是灭灯的决定权留给各位看官。但我提前说好,如果你全灭了,但却找不到更好的,未来还是得回来真香 :P
+在本文中,我们将看看本专题的学习目标、`tokio`该怎么引入以及如何实现一个 `Hello Tokio` 项目,最终亮灯还是灭灯的决定权留给各位看官。但我提前说好,如果你全灭了,但却找不到更好的,未来还是得回来真香 :P
## 专题目标
@@ -97,7 +97,7 @@ async fn main() -> Result<()> {
```shell
$ cargo run
-从服务器端获取到结果=Some(b"world")
+从服务器端获取到结果=Some("world")
```
Perfect, 代码成功运行,是时候来解释下其中蕴藏的至高奥秘了。
@@ -209,7 +209,7 @@ fn main() {
tokio = { version = "1", features = ["full"] }
```
-里面有个 `features = ["full"]` 可能大家会比较迷惑,当然,关于它的具体解释在本书的 [Cargo 详解专题](https://course.rs/cargo/intro.html) 有介绍,这里就简单进行说明,
+里面有个 `features = ["full"]` 可能大家会比较迷惑,当然,关于它的具体解释在本书的 [Cargo 详解专题](https://course.rs/cargo/intro.html) 有介绍,这里就简单进行说明。
`Tokio` 有很多功能和特性,例如 `TCP`,`UDP`,`Unix sockets`,同步工具,多调度类型等等,不是每个应用都需要所有的这些特性。为了优化编译时间和最终生成可执行文件大小、内存占用大小,应用可以对这些特性进行可选引入。
@@ -217,7 +217,7 @@ tokio = { version = "1", features = ["full"] }
## 总结
-大家对 `tokio` 的初印象如何?可否 24 灯全绿通过?
+大家对 `tokio` 的初印象如何?可否 24 灯全亮通过?
总之,`tokio` 做的事情其实是细雨润无声的,在大多数时候,我们并不能感觉到它的存在,但是它确实是异步编程中最重要的一环(或者之一),深入了解它对我们的未来之路会有莫大的帮助。
diff --git a/src/async-rust/tokio/overview.md b/src/async-rust/tokio/overview.md
index 787220ee..a069f908 100644
--- a/src/async-rust/tokio/overview.md
+++ b/src/async-rust/tokio/overview.md
@@ -79,7 +79,7 @@ Rust 语言的安全可靠性顺理成章的影响了 `tokio` 的可靠性,曾
> 若大家使用 tokio,那 CPU 密集的任务尤其需要用线程的方式去处理,例如使用 `spawn_blocking` 创建一个阻塞的线程取完成相应 CPU 密集任务。
>
-> 原因是:tokio 是协作式地调度器,如果某个 CPU 密集的异步任务是通过 tokio 创建的,那理论上来说,该异步任务需要跟其它的异步任务交错执行,最终大家都得到了执行,皆大欢喜。但实际情况是,CPU 密集的任务很可能会一直霸着着 CPU,此时 tokio 的调度方式决定了该任务会一直被执行,这意味着,其它的异步任务无法得到执行的机会,最终这些任务都会因为得不到资源而饿死。
+> 原因是:tokio 是协作式的调度器,如果某个 CPU 密集的异步任务是通过 tokio 创建的,那理论上来说,该异步任务需要跟其它的异步任务交错执行,最终大家都得到了执行,皆大欢喜。但实际情况是,CPU 密集的任务很可能会一直霸着着 CPU,此时 tokio 的调度方式决定了该任务会一直被执行,这意味着,其它的异步任务无法得到执行的机会,最终这些任务都会因为得不到资源而饿死。
>
> 而使用 `spawn_blocking` 后,会创建一个单独的 OS 线程,该线程并不会被 tokio 所调度( 被 OS 所调度 ),因此它所执行的 CPU 密集任务也不会导致 tokio 调度的那些异步任务被饿死
diff --git a/src/basic/base-type/numbers.md b/src/basic/base-type/numbers.md
index 535e5d86..1ca4d90c 100644
--- a/src/basic/base-type/numbers.md
+++ b/src/basic/base-type/numbers.md
@@ -4,13 +4,12 @@
计算机和数值关联在一起的时间,远比我们想象的要长,因此数值类型可以说是有计算机以来就有的类型,下面内容将深入讨论 Rust 的数值类型以及相关的运算符。
-## 整数和浮点数
Rust 使用一个相对传统的语法来创建整数(`1`,`2`,...)和浮点数(`1.0`,`1.1`,...)。整数、浮点数的运算和你在其它语言上见过的一致,都是通过常见的运算符来完成。
> 不仅仅是数值类型,Rust 也允许在复杂类型上定义运算符,例如在自定义类型上定义 `+` 运算符,这种行为被称为运算符重载,Rust 具体支持的可重载运算符见[附录 B](https://course.rs/appendix/operators.html#运算符)
-#### 整数类型
+## 整数类型
**整数**是没有小数部分的数字。之前使用过的 `i32` 类型,表示有符号的 32 位整数( `i` 是英文单词 _integer_ 的首字母,与之相反的是 `u`,代表无符号 `unsigned` 类型)。下表显示了 Rust 中的内置的整数类型:
@@ -42,91 +41,36 @@ Rust 使用一个相对传统的语法来创建整数(`1`,`2`,...)和浮
这么多类型,有没有一个简单的使用准则?答案是肯定的, Rust 整形默认使用 `i32`,例如 `let i = 1`,那 `i` 就是 `i32` 类型,因此你可以首选它,同时该类型也往往是性能最好的。`isize` 和 `usize` 的主要应用场景是用作集合的索引。
-> ##### 整型溢出
->
-> 比方说有一个 `u8` ,它可以存放从 0 到 255 的值。那么当你将其修改为范围之外的值,比如 256,则会发生**整型溢出**。关于这一行为 Rust 有一些有趣的规则:当在 debug 模式编译时,Rust 会检查整型溢出,若存在这些问题,则使程序在编译时 _panic_(崩溃,Rust 使用这个术语来表明程序因错误而退出)。
->
-> 在当使用 `--release` 参数进行 release 模式构建时,Rust **不**检测溢出。相反,当检测到整型溢出时,Rust 会按照补码循环溢出(_two’s complement wrapping_)的规则处理。简而言之,大于该类型最大值的数值会被补码转换成该类型能够支持的对应数字的最小值。比如在 `u8` 的情况下,256 变成 0,257 变成 1,依此类推。程序不会 _panic_,但是该变量的值可能不是你期望的值。依赖这种默认行为的代码都应该被认为是错误的代码。
->
-> 要显式处理可能的溢出,可以使用标准库针对原始数字类型提供的这些方法:
->
-> - 使用 `wrapping_*` 方法在所有模式下都按照补码循环溢出规则处理,例如 `wrapping_add`
-> - 如果使用 `checked_*` 方法时发生溢出,则返回 `None` 值
-> - 使用 `overflowing_*` 方法返回该值和一个指示是否存在溢出的布尔值
-> - 使用 `saturating_*` 方法使值达到最小值或最大值
-
-#### 浮点类型
-**浮点类型数字** 是带有小数点的数字,在 Rust 中浮点类型数字也有两种基本类型: `f32` 和 `f64`,分别为 32 位和 64 位大小。默认浮点类型是 `f64`,在现代的 CPU 中它的速度与 `f32` 几乎相同,但精度更高。
-
-下面是一个演示浮点数的示例:
+#### 整型溢出
-```rust
-fn main() {
- let x = 2.0; // f64
-
- let y: f32 = 3.0; // f32
-}
-```
-
-浮点数根据 `IEEE-754` 标准实现。`f32` 类型是单精度浮点型,`f64` 为双精度。
-
-#### 数字运算
-
-Rust 支持所有数字类型的基本数学运算:加法、减法、乘法、除法和取模运算。下面代码各使用一条 `let` 语句来说明相应运算的用法:
-
-```rust
-fn main() {
- // 加法
- let sum = 5 + 10;
+假设有一个 `u8` ,它可以存放从 0 到 255 的值。那么当你将其修改为范围之外的值,比如 256,则会发生**整型溢出**。关于这一行为 Rust 有一些有趣的规则:当在 debug 模式编译时,Rust 会检查整型溢出,若存在这些问题,则使程序在编译时 _panic_(崩溃,Rust 使用这个术语来表明程序因错误而退出)。
- // 减法
- let difference = 95.5 - 4.3;
+在当使用 `--release` 参数进行 release 模式构建时,Rust **不**检测溢出。相反,当检测到整型溢出时,Rust 会按照补码循环溢出(_two’s complement wrapping_)的规则处理。简而言之,大于该类型最大值的数值会被补码转换成该类型能够支持的对应数字的最小值。比如在 `u8` 的情况下,256 变成 0,257 变成 1,依此类推。程序不会 _panic_,但是该变量的值可能不是你期望的值。依赖这种默认行为的代码都应该被认为是错误的代码。
- // 乘法
- let product = 4 * 30;
+要显式处理可能的溢出,可以使用标准库针对原始数字类型提供的这些方法:
- // 除法
- let quotient = 56.7 / 32.2;
+- 使用 `wrapping_*` 方法在所有模式下都按照补码循环溢出规则处理,例如 `wrapping_add`
+- 如果使用 `checked_*` 方法时发生溢出,则返回 `None` 值
+- 使用 `overflowing_*` 方法返回该值和一个指示是否存在溢出的布尔值
+- 使用 `saturating_*` 方法使值达到最小值或最大值
- // 求余
- let remainder = 43 % 5;
-}
-```
+## 浮点类型
-这些语句中的每个表达式都使用了数学运算符,并且计算结果为一个值,然后绑定到一个变量上。[附录 B](https://course.rs/appendix/operators.html#运算符) 中给出了 Rust 提供的所有运算符的列表。
+**浮点类型数字** 是带有小数点的数字,在 Rust 中浮点类型数字也有两种基本类型: `f32` 和 `f64`,分别为 32 位和 64 位大小。默认浮点类型是 `f64`,在现代的 CPU 中它的速度与 `f32` 几乎相同,但精度更高。
-再来看一个综合性的示例:
+下面是一个演示浮点数的示例:
```rust
fn main() {
- // 编译器会进行自动推导,给予twenty i32的类型
- let twenty = 20;
- // 类型标注
- let twenty_one: i32 = 21;
- // 通过类型后缀的方式进行类型标注:22是i32类型
- let twenty_two = 22i32;
-
- // 只有同样类型,才能运算
- let addition = twenty + twenty_one + twenty_two;
- println!("{} + {} + {} = {}", twenty, twenty_one, twenty_two, addition);
-
- // 对于较长的数字,可以用_进行分割,提升可读性
- let one_million: i64 = 1_000_000;
- println!("{}", one_million.pow(2));
-
- // 定义一个f32数组,其中42.0会自动被推导为f32类型
- let forty_twos = [
- 42.0,
- 42f32,
- 42.0_f32,
- ];
+ let x = 2.0; // f64
- // 打印数组中第一个值,并控制小数位为2位
- println!("{:.2}", forty_twos[0]);
+ let y: f32 = 3.0; // f32
}
```
+浮点数根据 `IEEE-754` 标准实现。`f32` 类型是单精度浮点型,`f64` 为双精度。
+
#### 浮点数陷阱
浮点数由于底层格式的特殊性,导致了如果在使用浮点数时不够谨慎,就可能造成危险,有两个原因:
@@ -224,6 +168,106 @@ fn main() {
}
```
+## 数字运算
+
+Rust 支持所有数字类型的基本数学运算:加法、减法、乘法、除法和取模运算。下面代码各使用一条 `let` 语句来说明相应运算的用法:
+
+```rust
+fn main() {
+ // 加法
+ let sum = 5 + 10;
+
+ // 减法
+ let difference = 95.5 - 4.3;
+
+ // 乘法
+ let product = 4 * 30;
+
+ // 除法
+ let quotient = 56.7 / 32.2;
+
+ // 求余
+ let remainder = 43 % 5;
+}
+```
+
+这些语句中的每个表达式都使用了数学运算符,并且计算结果为一个值,然后绑定到一个变量上。[附录 B](https://course.rs/appendix/operators.html#运算符) 中给出了 Rust 提供的所有运算符的列表。
+
+再来看一个综合性的示例:
+
+```rust
+fn main() {
+ // 编译器会进行自动推导,给予twenty i32的类型
+ let twenty = 20;
+ // 类型标注
+ let twenty_one: i32 = 21;
+ // 通过类型后缀的方式进行类型标注:22是i32类型
+ let twenty_two = 22i32;
+
+ // 只有同样类型,才能运算
+ let addition = twenty + twenty_one + twenty_two;
+ println!("{} + {} + {} = {}", twenty, twenty_one, twenty_two, addition);
+
+ // 对于较长的数字,可以用_进行分割,提升可读性
+ let one_million: i64 = 1_000_000;
+ println!("{}", one_million.pow(2));
+
+ // 定义一个f32数组,其中42.0会自动被推导为f32类型
+ let forty_twos = [
+ 42.0,
+ 42f32,
+ 42.0_f32,
+ ];
+
+ // 打印数组中第一个值,并控制小数位为2位
+ println!("{:.2}", forty_twos[0]);
+}
+```
+
+
+
+## 位运算
+
+Rust的运算基本上和其他语言一样
+
+| 运算符 | 说明 |
+| ------- | -------------------------------------- |
+| & 位与 | 相同位置均为1时则为1,否则 |
+| \| 位或 | 相同位置只要有1时则为1,否则为0 |
+| ^ 异或 | 相同位置不相同则为1,相同则为0 |
+| ! 位非 | 把位中的0和1相互取反,即0置为1,1置为0 |
+| << 左移 | 所有位向左移动指定位数,右位补零 |
+| >> 右移 | 所有位向右移动指定位数,左位补零 |
+
+
+
+```rust
+fn main() {
+ // 二进制为00000010
+ let a:i32 = 2;
+ // 二进制为00000011
+ let b:i32 = 3;
+
+ println!("(a & b) value is {}", a & b);
+
+ println!("(a | b) value is {}", a | b);
+
+ println!("(a ^ b) value is {}", a ^ b);
+
+ println!("(!b) value is {} ", !b);
+
+ println!("(a << b) value is {}", a << b);
+
+ println!("(a >> b) value is {}", a >> b);
+
+ let mut a = a;
+ // 注意这些计算符除了!之外都可以加上=进行赋值 (因为!=要用来判断不等于)
+ a <<= b;
+ println!("(a << b) value is {}", a);
+}
+```
+
+
## 序列(Range)
Rust 提供了一个非常简洁的方式,用来生成连续的数值,例如 `1..5`,生成从 1 到 4 的连续数字,不包含 5 ;`1..=5`,生成从 1 到 5 的连续数字,包含 5,它的用途很简单,常常用于循环中:
diff --git a/src/cargo/getting-started.md b/src/cargo/getting-started.md
index bdafb2d6..a12b8d26 100644
--- a/src/cargo/getting-started.md
+++ b/src/cargo/getting-started.md
@@ -73,7 +73,7 @@ Hello, world!
`cargo run` 会帮我们自动完成编译、运行的过程,当然,该命令也支持 `Release` 模式: `cargo run --release`。
-> 如果你的程序在跑性能测试 benchmark,一定要使用 `Relase` 模式,因为该模式下,程序会做大量性能优化
+> 如果你的程序在跑性能测试 benchmark,一定要使用 `Release` 模式,因为该模式下,程序会做大量性能优化
在快速了解 `Cargo` 的使用方式后,下面,我们将正式进入 Cargo 的学习之旅。
diff --git a/src/studyrust.md b/src/community.md
similarity index 86%
rename from src/studyrust.md
rename to src/community.md
index 170e81d5..a23d485c 100644
--- a/src/studyrust.md
+++ b/src/community.md
@@ -7,7 +7,7 @@
---
这个社区与其它 Rust 社区有点不一样: 我们聚焦于 Rust 语言的学习研究和实战应用上,不搞花活!
-- 社区官网:[Rust语言中文网](https://rustl.cn),正在建设中,暂时跳转到 GitHub 组织首页
+- 官方网址:[https://rustl.cn](https://rustl.cn),正在建设中,暂时跳转到 GitHub 组织首页
- QQ交流群: 1009730433
以下是社区的部分 Rust 项目:
diff --git a/src/rust-weekly.md b/src/rust-weekly.md
index 4aeec07d..e5c2758f 100644
--- a/src/rust-weekly.md
+++ b/src/rust-weekly.md
@@ -1,16 +1,12 @@
-# Rust 语言周刊
+# 「Rust 语言周刊」 第 8 期 · 2022-04-15
+Rust语言周刊精选全世界过去一周的优秀文章、新闻、开源项目和语言动态。
-精选过去一周的文章、新闻、开源项目和 Rust 语言动态( 中文内容用 🇨🇳 进行标识 ),欢迎大家[订阅及查看往期回顾](https://github.com/studyrs/rust-weekly)。
+本周刊由 Rust 语言中文网倾情打造,其中的 `[Zh]` 标识的中文资料由 Rust 翻译计划提供,并且原始的 Markdown 文档已[全部开源](https://github.com/rustlang-cn/rustt),欢迎大家阅读和订阅。
+> 官方网址:https://cnru.st, 公众号: Rust语言中文网
-## 「Rust 语言周刊」 第 7 期 · 2022-04-08
-Rust 语言周刊精选过去一周的优秀文章、新闻、开源项目和 Rust 语言动态。
-
-本周刊由 Rust 语言中文网倾情打造,其中的 [Zh] 中文资料由 Rustt 进行翻译,原始 Markdown 文档已全部开源,欢迎大家阅读和订阅。
-
-
-
-
+
-干货作者又出手了,这次为我们带来了内存模型的分析和改进。他甚至基于这种改进修改了 Rust 代码,并且应用在自己的部分项目上,crazy!
+6、[生命苦短,我选择与编译检查搏斗?](https://kerkour.com/life-is-short-rust-borrow-checker)
-2、[Rust 的 Mutex 为何这样设计?](https://cliffle.com/blog/rust-mutexes/)
+本文很短,短到令人震惊,但是确实很好的吐槽了为了对付 Rust 编译检查,我们需要付出的努力。
-已经有不少人抱怨为何 Rust 的 Mutex 跟别的语言不一样,例如它可以持有数据。作者针对这些疑问给出了自己的分析,总之他站队 Rust 的设计。
+7、[默认值和类型推断:使用表达式来替代类型](https://gankra.github.io/blah/defaults-affect-inference/)
-3、[Zh] [在 Rust 中使用 epoll 实现非阻塞 IO](https://github.com/studyrs/Rustt/blob/main/Articles/%5B2022-03-29%5D%20在%20Rust%20中使用%20epoll%20实现基本的非阻塞%20IO.md)
+你是否注意过 Rust 中的集合类型存在一些奇怪的约束条件?这种奇怪已经存在很久了,甚至在 1.0 版本前就有,本文试图解释下相关的问题并且尝试使用一种新的方法去解决。
-本文试图解释清楚 epoll 和非阻塞 IO 背后的原理
+8、[隐性约束和完美派生](https://smallcultfollowing.com/babysteps/blog/2022/04/12/implied-bounds-and-perfect-derive/)
-4、[Zh] [用 Rust 写 Devops 工具](https://github.com/studyrs/Rustt/blob/main/Articles/%5B2022-04-02%5D%20用%20Rust%20写%20DevOps%20工具.md)
+在 Rust 社区中,有两个问题已经被讨论很久了:完美派生以及可扩展的隐性约束,但是最近,Rust 团队在实现它们时遇到了一些问题,一起来看看。
-文章中会介绍几个 Rust 用在 DevOps 领域的案例,以及为什么使用 Rust。其中我们还会介绍一些在 AWS 上基于 Rust 的 DevOps 工具常用的库。
-5、[Zh] [Rust 背后不是公司](https://github.com/studyrs/Rustt/blob/main/Articles/%5B2022-04-01%5D%20Rust%20背后并不是公司.md)
-Rust 大佬带来的对 Rust 组织架构的分析。
+9、[系列] [指针很复杂 III](https://www.ralfj.de/blog/2022/04/11/provenance-exposed.html)
-6、[使用 Rust 改善 Python S3 客户端的性能](https://joshua-robinson.medium.com/improving-python-s3-client-performance-with-rust-e9639359072f)
+作者目前的工作需要处理 Rust/MIR 的内存模型,因此会触及到普通开发不太熟悉的领域,系列的文章第一篇见[这里](https://www.ralfj.de/blog/2018/07/24/pointers-and-bytes.html)。
-Python 是数据科学的主力军语言,但是性能有的时候会成为平静下来。例如现在亚马逊 S3 存储非常火热,如果大家使用 S3 作为数据集的存储,那么 Pyhton 去读取这些数据可能就是一个很大的性能瓶颈。
+10、[使用 Rust 构建爬虫](https://kerkour.com/rust-crawler-associated-types)
-7、[Qiskit 使用 Rust 来获取更好的性能](https://medium.com/qiskit/new-weve-started-using-rust-in-qiskit-for-better-performance-a3676433ca8c)
+本文节选自 `Black Hat Rust`,在文中,作者清晰的解释了 `scraper` 和 `crawler` 的区别,以及介绍了 Rust 为何非常适合爬虫的原因。
-Qiskit 是一家从事量子计算的公司,最近他们 在 Python 之外还引入了 Rust 语言,事实证明,这个举措带来了显著的性能提升。
-8、[ScyllaDB 将数据库驱动使用异步 Rust 重新实现](https://thenewstack.io/why-were-porting-our-database-drivers-to-async-rust/)
+#### 开源项目
-ScyllaDB 是这几年很火的开源分布式 KV 数据库,兼容 Cassandra 的 CQL 协议,性能非常非常高。这不,为了性能和安全性,他们又出手了,这次是使用 Rust 将客户端的驱动进行了重写( 使用 tokio )。
+1、[fdb - 基于 Tokio 的 FoundationDB 客户端驱动](https://github.com/fdb-rs/fdb)
-9、[在 2022 年使用 axum 和 yew 打造一个全栈 Rust web 服务](https://robert.kra.hn/posts/2022-04-03_rust-web-wasm/)
+FoundationDB 于数年前被苹果收购,并且服务于生产环境多年,是一个非常可靠、非常非常有特色的分布式数据库。
-在过去两年,WebAssembly 在 Rust 这里发展的非常快,而且构建和打包也变得更加简单。因此,是时候使用 Rust 写一套前后端服务了。
+2、[ogma - 用于处理表格化数据的脚本语言](https://github.com/kdr-aus/ogma)
+
diff --git a/内容变更记录.md b/内容变更记录.md
index d02646eb..c5ae59a5 100644
--- a/内容变更记录.md
+++ b/内容变更记录.md
@@ -1,6 +1,10 @@
# ChangeLog
记录一些值得注意的变更。
+## 2022-04-15
+
+- 调整数值类型章节的目录结构,并新增位运算,感谢 [liCells](https://github.com/liCells) 提交的 PR
+
## 2022-04-12
- [优化字符串章节,增加字符串转义](https://course.rs/basic/compound-type/string-slice.html#字符串转义)