From 1b2a3653b949d6568c00843a32a131c92921d459 Mon Sep 17 00:00:00 2001 From: sunface Date: Tue, 26 Apr 2022 12:50:55 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E4=BC=98=E5=8C=96=20cargo=20=E5=85=A5?= =?UTF-8?q?=E9=97=A8=E7=AB=A0=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/first-try/cargo.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/first-try/cargo.md b/src/first-try/cargo.md index 738dcec4..919d0ee6 100644 --- a/src/first-try/cargo.md +++ b/src/first-try/cargo.md @@ -22,6 +22,7 @@ Go 语言在 1.10 版本之前,所有的包都是在 `github.com` 下存放, ```console $ cargo new world_hello +$ cd world_hello ``` 上面的命令使用 `cargo new` 创建一个项目,项目名是 `world_hello` (向读者势力低头的项目名称,泪奔),该项目的结构和配置文件都是由 `cargo` 生成,意味着**我们的项目被 `cargo` 所管理**。 @@ -32,6 +33,7 @@ $ cargo new world_hello ```console $ cargo new world_hello --bin +$ cd world_hello ``` 现在的版本,已经无需此参数,`cargo` 默认就创建 `bin` 类型的项目,顺便说一句,Rust 项目主要分为两个类型:`bin` 和 `lib`,前者是一个可运行的项目,后者是一个依赖库项目。 @@ -39,6 +41,7 @@ $ cargo new world_hello --bin 下面来看看创建的项目结构: ```console +$ tree . ├── .git ├── .gitignore @@ -58,7 +61,7 @@ $ cargo new world_hello --bin 2. 手动编译和运行项目 -首先来看看`cargo run`,一码胜似千言: +首先来看看第一种方式,一码胜似千言,在之前创建的 `world_hello` 目录下运行: ```console $ cargo run From 2ddb946acc617c3b801cb892255419d88ec3b2c9 Mon Sep 17 00:00:00 2001 From: zongzi531 Date: Tue, 26 Apr 2022 13:44:32 +0800 Subject: [PATCH 2/8] fix: words --- src/logs/about-log.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/logs/about-log.md b/src/logs/about-log.md index 5c22a86a..f43b3057 100644 --- a/src/logs/about-log.md +++ b/src/logs/about-log.md @@ -11,7 +11,7 @@ 日志级别是对基本的“滚动文本”式日志记录的一个重要补充。每条日志消息都会基于其重要性或严重程度分配到一个日志级别。例如,对于某个程序,“你的电脑着火了”是一个非常重要的消息,而“无法找到配置文件”的重要等级可能就低一些;但对于另外一些程序,"无法找到配置文件" 可能才是最严重的错误,会直接导致程序无法正常启动,而“电脑着火”? 我们可能会记录为一条 `Debug` 日志(参见下文) :D。 -至于到底该如何定义日志级别,这是仁者见仁的事情,并没有一个约定俗成的方式,就连很多大公司,都无法保证自己的开发者严格按照它所制定的规则来输出日。而下面是我认为的日志级别以及相关定义: +至于到底该如何定义日志级别,这是仁者见仁的事情,并没有一个约定俗成的方式,就连很多大公司,都无法保证自己的开发者严格按照它所制定的规则来输出日志。而下面是我认为的日志级别以及相关定义: - Fatal: 程序发生致命错误,祝你好运。这种错误往往来自于程序逻辑的严重异常,例如之前提到的“无法找到配置文件”,再比如无法分配足够的硬盘空间、内存不够用等。遇到这种错误,建议立即退出或者重启程序,然后记录下相应的错误信息 From 46e38ca118ed42fdad2e114a013ce87d824eaa4b Mon Sep 17 00:00:00 2001 From: p9s Date: Tue, 26 Apr 2022 20:13:11 +0800 Subject: [PATCH 3/8] Update numbers.md --- src/basic/base-type/numbers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/basic/base-type/numbers.md b/src/basic/base-type/numbers.md index 1ca4d90c..c7c4795a 100644 --- a/src/basic/base-type/numbers.md +++ b/src/basic/base-type/numbers.md @@ -232,7 +232,7 @@ Rust的运算基本上和其他语言一样 | 运算符 | 说明 | | ------- | -------------------------------------- | -| & 位与 | 相同位置均为1时则为1,否则 | +| & 位与 | 相同位置均为1时则为1,否则为0 | | \| 位或 | 相同位置只要有1时则为1,否则为0 | | ^ 异或 | 相同位置不相同则为1,相同则为0 | | ! 位非 | 把位中的0和1相互取反,即0置为1,1置为0 | From 87ea2898fb144922e93cb89fe1a4ce0d366442b0 Mon Sep 17 00:00:00 2001 From: p9s Date: Tue, 26 Apr 2022 21:52:14 +0800 Subject: [PATCH 4/8] Update string-slice.md --- src/basic/compound-type/string-slice.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/basic/compound-type/string-slice.md b/src/basic/compound-type/string-slice.md index f84cd10c..0474c7f6 100644 --- a/src/basic/compound-type/string-slice.md +++ b/src/basic/compound-type/string-slice.md @@ -1,6 +1,6 @@ # 字符串 -在其他语言,字符串往往是送分题,因为实在是太简单了,例如 `"hello, world"` 就是字符串章节的几乎全部内容了,但是如果你带着同样的想法来学 Rust,我保证,绝对会栽跟头,**因此这一章大家一定要重视,仔细阅读,这里有很多其它 Rust 书籍中没有的内容**。 +在其他语言中,字符串往往是送分题,因为实在是太简单了,例如 `"hello, world"` 就是字符串章节的几乎全部内容了,但是如果你带着同样的想法来学 Rust,我保证,绝对会栽跟头,**因此这一章大家一定要重视,仔细阅读,这里有很多其它 Rust 书籍中没有的内容**。 首先来看段很简单的代码: From 6374fa93ba508bc55b7d9ae48c3a6138391f25d4 Mon Sep 17 00:00:00 2001 From: chenxiaochun Date: Wed, 27 Apr 2022 08:19:55 +0800 Subject: [PATCH 5/8] Update module.md --- src/basic/crate-module/module.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/basic/crate-module/module.md b/src/basic/crate-module/module.md index eba9d122..3bc217f1 100644 --- a/src/basic/crate-module/module.md +++ b/src/basic/crate-module/module.md @@ -127,7 +127,7 @@ front_of_house::hosting::add_to_waitlist(); 如果只是为了引用到指定模块中的对象,那么两种都可以,但是在实际使用时,需要遵循一个原则:**当代码被挪动位置时,尽量减少引用路径的修改**,相信大家都遇到过,修改了某处代码,导致所有路径都要挨个替换,这显然不是好的路径选择。 -回到之前的例子,如果我们把 `front_of_house` 模块和 `eat_at_restaurant` 移动到一个模块中 `customer_experience`,那么绝对路径的引用方式就必须进行修改:`crate::customer_experience::front_of_house ...`,但是假设我们使用的相对路径,那么该路径就无需修改,因为它们两的相对位置其实没有变: +回到之前的例子,如果我们把 `front_of_house` 模块和 `eat_at_restaurant` 移动到一个模块中 `customer_experience`,那么绝对路径的引用方式就必须进行修改:`crate::customer_experience::front_of_house ...`,但是假设我们使用的相对路径,那么该路径就无需修改,因为它们两个的相对位置其实没有变: ```console crate From 90fbf2aea2fa82527ee73fde14d58cbc46f34874 Mon Sep 17 00:00:00 2001 From: zongzi531 Date: Wed, 27 Apr 2022 13:50:24 +0800 Subject: [PATCH 6/8] fix: typo in tracing.md --- src/logs/tracing.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/logs/tracing.md b/src/logs/tracing.md index 808ef519..5c6d4566 100644 --- a/src/logs/tracing.md +++ b/src/logs/tracing.md @@ -65,9 +65,9 @@ fn main() { ## 核心概念 -`tracing` 中最重要的三个概念是 `span`、`event` 和 `collector`,下面我们来一一简单介绍下。 +`tracing` 中最重要的三个概念是 `Span`、`Event` 和 `Collector`,下面我们来一一简单介绍下。 -### span +### Span 相比起日志只能记录在某个时间点发生的事件,`span` 最大的意义就在于它可以记录一个过程,也就是在某一段时间内发生的事件流。既然是记录时间段,那自然有开始和结束: ```rust @@ -214,7 +214,7 @@ my_future ``` -### spans 嵌套 +### span 嵌套 `tracing` 的 span 不仅仅是上面展示的基本用法,它们还可以进行嵌套! ```rust use tracing::{debug, info, span, Level}; @@ -249,7 +249,6 @@ DEBUG foo: log_test: end bar scope 在上面的日志中,`foo:bar` 不仅包含了 `foo` 和 `bar` span 名,还显示了它们之间的嵌套关系。 - ## 对宏进行配置 ### 日志级别和目标 From 7d509e9a7e017093de6b879ebfcf45f7bbefc7af Mon Sep 17 00:00:00 2001 From: p9s Date: Wed, 27 Apr 2022 18:50:46 +0800 Subject: [PATCH 7/8] Update string-slice.md --- src/basic/compound-type/string-slice.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/basic/compound-type/string-slice.md b/src/basic/compound-type/string-slice.md index 0474c7f6..c53154f5 100644 --- a/src/basic/compound-type/string-slice.md +++ b/src/basic/compound-type/string-slice.md @@ -222,7 +222,7 @@ fn say_hello(s: &str) { #### 深入字符串内部 -字符串的底层的数据存储格式实际上是[ `u8` ],一个字节数组。对于 `let hello = String::from("Hola");` 这行代码来说,`hello` 的长度是 `4` 个字节,因为 `"hola"` 中的每个字母在 UTF-8 编码中仅占用 1 个字节,但是对于下面的代码呢? +字符串的底层的数据存储格式实际上是[ `u8` ],一个字节数组。对于 `let hello = String::from("Hola");` 这行代码来说,`Hola` 的长度是 `4` 个字节,因为 `"Hola"` 中的每个字母在 UTF-8 编码中仅占用 1 个字节,但是对于下面的代码呢? ```rust let hello = String::from("中国人"); From b2bcf06ca3eb61ec0c4fb4f1cd1c7d6567cb6973 Mon Sep 17 00:00:00 2001 From: sunface Date: Wed, 27 Apr 2022 21:10:49 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/first-try/hello-world.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/first-try/hello-world.md b/src/first-try/hello-world.md index 9121320e..fa0b3bb1 100644 --- a/src/first-try/hello-world.md +++ b/src/first-try/hello-world.md @@ -90,10 +90,12 @@ fn main() { let name = fields[0]; // 1. 尝试把 fields[1] 的值转换为 f32 类型的浮点数,如果成功,则把 f32 值赋给 length 变量 + // // 2. if let 是一个匹配表达式,用来从=右边的结果中,匹配出 length 的值: - // 当=右边的表达式执行成功,则会返回一个 Ok(f32) 的类型,若失败,则会返回一个 Err(e) 类型,if let 的作用就是仅匹配 Ok 也就是成功的情 - // 况,如果是错误,就直接忽略,同时 if let 还会做一次解构匹配,通过 Ok(length) 去匹配右边的 Ok(f32),最终把相应的 f32 值赋给 length - // 3. 当然你也可以忽视成功的情况,用 if let Err(e) = fields[1].parse::() {...}匹配出错误,然后打印出来,但是没啥卵用 + // 1)当=右边的表达式执行成功,则会返回一个 Ok(f32) 的类型,若失败,则会返回一个 Err(e) 类型,if let 的作用就是仅匹配 Ok 也就是成功的情况,如果是错误,就直接忽略 + // 2)同时 if let 还会做一次解构匹配,通过 Ok(length) 去匹配右边的 Ok(f32),最终把相应的 f32 值赋给 length + // + // 3. 当然你也可以忽略成功的情况,用 if let Err(e) = fields[1].parse::() {...}匹配出错误,然后打印出来,但是没啥卵用 if let Ok(length) = fields[1].parse::() { // 输出到标准输出 println!("{}, {}cm", name, length);