到2.4为止的一些标点补齐更正。

pull/1151/head
gfzum 2 years ago
parent 367edd6350
commit 03fdf2605b

@ -37,7 +37,7 @@ $ cargo run
字符'中'占用了4字节的内存大小 字符'中'占用了4字节的内存大小
``` ```
> 注意我们还没开始讲字符串但是这里提前说一下和一些语言不同Rust 的字符只能用 `''` 来表示, `""` 是留给字符串的 > 注意我们还没开始讲字符串但是这里提前说一下和一些语言不同Rust 的字符只能用 `''` 来表示, `""` 是留给字符串的
## 布尔(bool) ## 布尔(bool)

@ -7,7 +7,7 @@
Rust 使用一个相对传统的语法来创建整数(`1``2`...)和浮点数(`1.0``1.1`...)。整数、浮点数的运算和你在其它语言上见过的一致,都是通过常见的运算符来完成。 Rust 使用一个相对传统的语法来创建整数(`1``2`...)和浮点数(`1.0``1.1`...)。整数、浮点数的运算和你在其它语言上见过的一致,都是通过常见的运算符来完成。
> 不仅仅是数值类型Rust 也允许在复杂类型上定义运算符,例如在自定义类型上定义 `+` 运算符这种行为被称为运算符重载Rust 具体支持的可重载运算符见[附录 B](https://course.rs/appendix/operators.html#运算符) > 不仅仅是数值类型Rust 也允许在复杂类型上定义运算符,例如在自定义类型上定义 `+` 运算符这种行为被称为运算符重载Rust 具体支持的可重载运算符见[附录 B](https://course.rs/appendix/operators.html#运算符)
## 整数类型 ## 整数类型

@ -208,7 +208,7 @@ enum Websocket {
在其它编程语言中,往往都有一个 `null` 关键字,该关键字用于表明一个变量当前的值为空(不是零值,例如整型的零值是 0也就是不存在值。当你对这些 `null` 进行操作时,例如调用一个方法,就会直接抛出**null 异常**,导致程序的崩溃,因此我们在编程时需要格外的小心去处理这些 `null` 空值。 在其它编程语言中,往往都有一个 `null` 关键字,该关键字用于表明一个变量当前的值为空(不是零值,例如整型的零值是 0也就是不存在值。当你对这些 `null` 进行操作时,例如调用一个方法,就会直接抛出**null 异常**,导致程序的崩溃,因此我们在编程时需要格外的小心去处理这些 `null` 空值。
> Tony Hoare `null` 的发明者,曾经说过一段非常有名的话 > Tony Hoare `null` 的发明者,曾经说过一段非常有名的话
> >
> 我称之为我十亿美元的错误。当时,我在使用一个面向对象语言设计第一个综合性的面向引用的类型系统。我的目标是通过编译器的自动检查来保证所有引用的使用都应该是绝对安全的。不过在设计过程中,我未能抵抗住诱惑,引入了空引用的概念,因为它非常容易实现。就是因为这个决策,引发了无数错误、漏洞和系统崩溃,在之后的四十多年中造成了数十亿美元的苦痛和伤害。 > 我称之为我十亿美元的错误。当时,我在使用一个面向对象语言设计第一个综合性的面向引用的类型系统。我的目标是通过编译器的自动检查来保证所有引用的使用都应该是绝对安全的。不过在设计过程中,我未能抵抗住诱惑,引入了空引用的概念,因为它非常容易实现。就是因为这个决策,引发了无数错误、漏洞和系统崩溃,在之后的四十多年中造成了数十亿美元的苦痛和伤害。

@ -95,7 +95,7 @@ let slice = &s[..];
> ``` > ```
> >
> 因为我们只取 `s` 字符串的前两个字节,但是本例中每个汉字占用三个字节,因此没有落在边界处,也就是连 `中` 字都取不完整,此时程序会直接崩溃退出,如果改成 `&s[0..3]`,则可以正常通过编译。 > 因为我们只取 `s` 字符串的前两个字节,但是本例中每个汉字占用三个字节,因此没有落在边界处,也就是连 `中` 字都取不完整,此时程序会直接崩溃退出,如果改成 `&s[0..3]`,则可以正常通过编译。
> 因此,当你需要对字符串做切片索引操作时,需要格外小心这一点, 关于该如何操作 UTF-8 字符串,参见[这里](#操作-utf-8-字符串) > 因此,当你需要对字符串做切片索引操作时,需要格外小心这一点, 关于该如何操作 UTF-8 字符串,参见[这里](#操作-utf-8-字符串)
字符串切片的类型标识是 `&str`,因此我们可以这样声明一个函数,输入 `String` 类型,返回它的切片: `fn first_word(s: &String) -> &str ` 字符串切片的类型标识是 `&str`,因此我们可以这样声明一个函数,输入 `String` 类型,返回它的切片: `fn first_word(s: &String) -> &str `
@ -706,7 +706,7 @@ for b in "中国人".bytes() {
与其它系统编程语言的 `free` 函数相同Rust 也提供了一个释放内存的函数: `drop`,但是不同的是,其它语言要手动调用 `free` 来释放每一个变量占用的内存,而 Rust 则在变量离开作用域时,自动调用 `drop` 函数: 上面代码中Rust 在结尾的 `}` 处自动调用 `drop` 与其它系统编程语言的 `free` 函数相同Rust 也提供了一个释放内存的函数: `drop`,但是不同的是,其它语言要手动调用 `free` 来释放每一个变量占用的内存,而 Rust 则在变量离开作用域时,自动调用 `drop` 函数: 上面代码中Rust 在结尾的 `}` 处自动调用 `drop`
> 其实,在 C++ 中,也有这种概念: _Resource Acquisition Is Initialization (RAII)_。如果你使用过 RAII 模式的话应该对 Rust 的 `drop` 函数并不陌生 > 其实,在 C++ 中,也有这种概念: _Resource Acquisition Is Initialization (RAII)_。如果你使用过 RAII 模式的话应该对 Rust 的 `drop` 函数并不陌生
这个模式对编写 Rust 代码的方式有着深远的影响,在后面章节我们会进行更深入的介绍。 这个模式对编写 Rust 代码的方式有着深远的影响,在后面章节我们会进行更深入的介绍。

@ -389,7 +389,7 @@ rect1 is Rectangle {
还有一个简单的输出 debug 信息的方法,那就是使用 [`dbg!` 宏](https://doc.rust-lang.org/std/macro.dbg.html),它会拿走表达式的所有权,然后打印出相应的文件名、行号等 debug 信息,当然还有我们需要的表达式的求值结果。**除此之外,它最终还会把表达式值的所有权返回!** 还有一个简单的输出 debug 信息的方法,那就是使用 [`dbg!` 宏](https://doc.rust-lang.org/std/macro.dbg.html),它会拿走表达式的所有权,然后打印出相应的文件名、行号等 debug 信息,当然还有我们需要的表达式的求值结果。**除此之外,它最终还会把表达式值的所有权返回!**
> `dbg!` 输出到标准错误输出 `stderr`,而 `println!` 输出到标准输出 `stdout` > `dbg!` 输出到标准错误输出 `stderr`,而 `println!` 输出到标准输出 `stdout`
下面的例子中清晰的展示了 `dbg!` 如何在打印出信息的同时,还把表达式的值赋给了 `width`: 下面的例子中清晰的展示了 `dbg!` 如何在打印出信息的同时,还把表达式的值赋给了 `width`:

@ -44,10 +44,9 @@ fn add(i: i32, j: i32) -> i32 {
``` ```
> 注意 > 注意
> 在上面的 `add` 函数中,不要为 `i+j` 添加 `;`,这会改变语法导致函数返回 `()` 而不是 `i32`,具体参见[语句和表达式](https://course.rs/basic/base-type/statement-expression.html) > 在上面的 `add` 函数中,不要为 `i+j` 添加 `;`,这会改变语法导致函数返回 `()` 而不是 `i32`,具体参见[语句和表达式](https://course.rs/basic/base-type/statement-expression.html)
有几点可以留意下: 有几点可以留意下:
- 字符串使用双引号 `""` 而不是单引号 `''`Rust 中单引号是留给单个字符类型(`char`)使用的 - 字符串使用双引号 `""` 而不是单引号 `''`Rust 中单引号是留给单个字符类型(`char`)使用的
- Rust 使用 `{}` 来作为格式化输出占位符,其它语言可能使用的是 `%s``%d``%p` 等,由于 `println!` 会自动推导出具体的类型,因此无需手动指定 - Rust 使用 `{}` 来作为格式化输出占位符,其它语言可能使用的是 `%s``%d``%p` 等,由于 `println!` 会自动推导出具体的类型,因此无需手动指定

@ -289,7 +289,7 @@ fn dangle() -> &String { // dangle 返回一个字符串的引用
// 危险! // 危险!
``` ```
因为 `s` 是在 `dangle` 函数内创建的,当 `dangle` 的代码执行完毕后,`s` 将被释放, 但是此时我们又尝试去返回它的引用。这意味着这个引用会指向一个无效的 `String`,这可不对! 因为 `s` 是在 `dangle` 函数内创建的,当 `dangle` 的代码执行完毕后,`s` 将被释放但是此时我们又尝试去返回它的引用。这意味着这个引用会指向一个无效的 `String`,这可不对!
其中一个很好的解决方法是直接返回 `String` 其中一个很好的解决方法是直接返回 `String`

@ -119,7 +119,7 @@ $ cargo check
Finished dev [unoptimized + debuginfo] target(s) in 0.06s Finished dev [unoptimized + debuginfo] target(s) in 0.06s
``` ```
> Rust 虽然编译速度还行,但是还是不能与 Go 语言相提并论,因为 Rust 需要做很多复杂的编译优化和语言特性解析,甚至连如何优化编译速度都成了一门学问: [优化编译速度](https://course.rs/profiling/compiler/speed-up.html) > Rust 虽然编译速度还行,但是还是不能与 Go 语言相提并论,因为 Rust 需要做很多复杂的编译优化和语言特性解析,甚至连如何优化编译速度都成了一门学问: [优化编译速度](https://course.rs/profiling/compiler/speed-up.html)
## Cargo.toml 和 Cargo.lock ## Cargo.toml 和 Cargo.lock
@ -129,7 +129,7 @@ $ cargo check
- `Cargo.lock` 文件是 `cargo` 工具根据同一项目的 `toml` 文件生成的**项目依赖详细清单**,因此我们一般不用修改它,只需要对着 `Cargo.toml` 文件撸就行了。 - `Cargo.lock` 文件是 `cargo` 工具根据同一项目的 `toml` 文件生成的**项目依赖详细清单**,因此我们一般不用修改它,只需要对着 `Cargo.toml` 文件撸就行了。
> 什么情况下该把 `Cargo.lock` 上传到 git 仓库里?很简单,当你的项目是一个可运行的程序时,就上传 `Cargo.lock`,如果是一个依赖库项目,那么请把它添加到 `.gitignore` > 什么情况下该把 `Cargo.lock` 上传到 git 仓库里?很简单,当你的项目是一个可运行的程序时,就上传 `Cargo.lock`,如果是一个依赖库项目,那么请把它添加到 `.gitignore`
现在用 VSCode 打开上面创建的"世界,你好"项目,然后进入根目录的 `Cargo.toml` 文件,可以看到该文件包含不少信息: 现在用 VSCode 打开上面创建的"世界,你好"项目,然后进入根目录的 `Cargo.toml` 文件,可以看到该文件包含不少信息:

@ -46,4 +46,3 @@
4. `CodeLLDB`, Debugger 程序 4. `CodeLLDB`, Debugger 程序
好了至此VSCode 的配置就已经全部结束,是不是很简单?下面让我们来用 `Cargo` 创建一个 Rust 项目,然后用 VSCode 打开。 好了至此VSCode 的配置就已经全部结束,是不是很简单?下面让我们来用 `Cargo` 创建一个 Rust 项目,然后用 VSCode 打开。

@ -122,4 +122,3 @@ fn main() {
具体运行代码就不给了,留给大家作为一个小练习,建议亲自动手尝试下。 具体运行代码就不给了,留给大家作为一个小练习,建议亲自动手尝试下。
至此Rust 安装入门就已经结束。相信看到这里,你已经发现了本书与其它书的区别,其中最大的区别就是:**这本书就像优秀的国外课本一样,不太枯燥。也希望这本不太枯燥的书,能伴你长行,犹如一杯奶茶,细细品之,唇齿留香。** 至此Rust 安装入门就已经结束。相信看到这里,你已经发现了本书与其它书的区别,其中最大的区别就是:**这本书就像优秀的国外课本一样,不太枯燥。也希望这本不太枯燥的书,能伴你长行,犹如一杯奶茶,细细品之,唇齿留香。**

@ -5,7 +5,7 @@
> haha开个玩笑。读者乃大大怎么能弃之不顾。 > haha开个玩笑。读者乃大大怎么能弃之不顾。
> >
> 注意:如果你不想用或者不能用 rustup请参见 [Rust 其它安装方法](https://forge.rust-lang.org/infra/other-installation-methods.html#other-rust-installation-methods) > 注意:如果你不想用或者不能用 rustup请参见 [Rust 其它安装方法](https://forge.rust-lang.org/infra/other-installation-methods.html#other-rust-installation-methods)
至于版本,现在 Rust 稳定版特性越来越全了,因此下载最新稳定版本即可。由于你用的 Rust 版本可能跟本书写作时不一样,一些编译错误和警告可能也会有所不同。 至于版本,现在 Rust 稳定版特性越来越全了,因此下载最新稳定版本即可。由于你用的 Rust 版本可能跟本书写作时不一样,一些编译错误和警告可能也会有所不同。

@ -8,4 +8,3 @@
2. 搭建 VSCode 所需的环境 2. 搭建 VSCode 所需的环境
3. 简单介绍 Cargo 3. 简单介绍 Cargo
4. 实现一个酷炫多国语言版本的“世界,你好”的程序,并且谈谈对 Rust 语言的初印象 4. 实现一个酷炫多国语言版本的“世界,你好”的程序,并且谈谈对 Rust 语言的初印象

@ -23,7 +23,7 @@ export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_pr
为了使用 `crates.io` 之外的注册服务,我们需要对 `$HOME/.cargo/config.toml` ($CARGO_HOME 下) 文件进行配置,添加新的服务提供商,有两种方式可以实现:增加新的镜像地址和覆盖默认的镜像地址。 为了使用 `crates.io` 之外的注册服务,我们需要对 `$HOME/.cargo/config.toml` ($CARGO_HOME 下) 文件进行配置,添加新的服务提供商,有两种方式可以实现:增加新的镜像地址和覆盖默认的镜像地址。
> 这里推荐使用[科大的注册服务](http://mirrors.ustc.edu.cn/help/crates.io-index.html)来提升下载速度,以下注册服务的链接都是科大的 > 这里推荐使用[科大的注册服务](http://mirrors.ustc.edu.cn/help/crates.io-index.html)来提升下载速度,以下注册服务的链接都是科大的
#### 增加新的镜像地址 #### 增加新的镜像地址

Loading…
Cancel
Save