Merge pull request #12 from sunface/main

sync
pull/833/head
Rustln 3 years ago committed by GitHub
commit 147b2c2244
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -232,7 +232,7 @@ Rust的运算基本上和其他语言一样
| 运算符 | 说明 |
| ------- | -------------------------------------- |
| & 位与 | 相同位置均为1时则为1否则 |
| & 位与 | 相同位置均为1时则为1否则为0 |
| \| 位或 | 相同位置只要有1时则为1否则为0 |
| ^ 异或 | 相同位置不相同则为1相同则为0 |
| ! 位非 | 把位中的0和1相互取反即0置为11置为0 |

@ -1,6 +1,6 @@
# 字符串
在其他语言,字符串往往是送分题,因为实在是太简单了,例如 `"hello, world"` 就是字符串章节的几乎全部内容了,但是如果你带着同样的想法来学 Rust我保证绝对会栽跟头**因此这一章大家一定要重视,仔细阅读,这里有很多其它 Rust 书籍中没有的内容**。
在其他语言,字符串往往是送分题,因为实在是太简单了,例如 `"hello, world"` 就是字符串章节的几乎全部内容了,但是如果你带着同样的想法来学 Rust我保证绝对会栽跟头**因此这一章大家一定要重视,仔细阅读,这里有很多其它 Rust 书籍中没有的内容**。
首先来看段很简单的代码:
@ -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("中国人");

@ -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

@ -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

@ -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::<f32>() {...}匹配出错误,然后打印出来,但是没啥卵用
// 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::<f32>() {...}匹配出错误,然后打印出来,但是没啥卵用
if let Ok(length) = fields[1].parse::<f32>() {
// 输出到标准输出
println!("{}, {}cm", name, length);

@ -11,7 +11,7 @@
日志级别是对基本的“滚动文本”式日志记录的一个重要补充。每条日志消息都会基于其重要性或严重程度分配到一个日志级别。例如,对于某个程序,“你的电脑着火了”是一个非常重要的消息,而“无法找到配置文件”的重要等级可能就低一些;但对于另外一些程序,"无法找到配置文件" 可能才是最严重的错误,会直接导致程序无法正常启动,而“电脑着火”? 我们可能会记录为一条 `Debug` 日志(参见下文) :D。
至于到底该如何定义日志级别,这是仁者见仁的事情,并没有一个约定俗成的方式,就连很多大公司,都无法保证自己的开发者严格按照它所制定的规则来输出日。而下面是我认为的日志级别以及相关定义:
至于到底该如何定义日志级别,这是仁者见仁的事情,并没有一个约定俗成的方式,就连很多大公司,都无法保证自己的开发者严格按照它所制定的规则来输出日。而下面是我认为的日志级别以及相关定义:
- Fatal: 程序发生致命错误,祝你好运。这种错误往往来自于程序逻辑的严重异常,例如之前提到的“无法找到配置文件”,再比如无法分配足够的硬盘空间、内存不够用等。遇到这种错误,建议立即退出或者重启程序,然后记录下相应的错误信息

@ -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 名,还显示了它们之间的嵌套关系。
## 对宏进行配置
### 日志级别和目标

Loading…
Cancel
Save