pull/605/head
sunface 3 years ago
commit 99fa9b7411

@ -1,7 +1,7 @@
<h1 align="center">Rust语言圣经</h1> <h1 align="center">Rust语言圣经</h1>
<div align="center"> <div align="center">
<img height="150" src="https://github.com/sunface/rust-by-practice/blob/master/assets/logo.png?raw=true"> <img height="150" src="https://github.com/sunface/rust-by-practice/blob/master/en/assets/logo.png?raw=true">
</div> </div>
<div align="center"> <div align="center">
@ -18,6 +18,8 @@
- [Rust语言周刊](https://github.com/sunface/rust-weekly),每周一发布,精选过去一周的技术文章、业界新闻、开源项目和 Rust 语言动态 - [Rust语言周刊](https://github.com/sunface/rust-weekly),每周一发布,精选过去一周的技术文章、业界新闻、开源项目和 Rust 语言动态
- [Rust酷库推荐](https://github.com/sunface/fancy-rust),优秀项目很多,如何在茫茫码海中与它们相遇?相比 Awesome Rust它能带给你全新的体验和选择 - [Rust酷库推荐](https://github.com/sunface/fancy-rust),优秀项目很多,如何在茫茫码海中与它们相遇?相比 Awesome Rust它能带给你全新的体验和选择
- 创作团队: [RustTT 翻译组](https://rusttt.org),目前最专业的 Rust 翻译组织,这里有 Rust 技术文章、学习教程和新闻资讯的高质量中文翻译
## 教程简介 ## 教程简介
@ -68,6 +70,7 @@ QQ群 1009730433 欢迎大家加入,一起 happy一起进步。
尤其感谢这些主要贡献者,谢谢你们花费大量时间贡献了多处`fix`和高质量的内容优化。非常感动,再次感谢~~ 尤其感谢这些主要贡献者,谢谢你们花费大量时间贡献了多处`fix`和高质量的内容优化。非常感动,再次感谢~~
## 借鉴的书籍 ## 借鉴的书籍
站在巨人的肩膀上,能帮我们看的更远,特此感谢以下巨人: 站在巨人的肩膀上,能帮我们看的更远,特此感谢以下巨人:

@ -1,7 +1,7 @@
<h1 align="center">Rust语言圣经</h1> <h1 align="center">Rust语言圣经</h1>
<div align="center"> <div align="center">
<img height="150" src="https://github.com/sunface/rust-by-practice/blob/master/assets/logo.png?raw=true"> <img height="150" src="https://github.com/sunface/rust-by-practice/blob/master/en/assets/logo.png?raw=true">
</div> </div>
<div align="center"> <div align="center">

@ -24,7 +24,7 @@ error[E0277]: the size for values of type `str` cannot be known at compilation t
| ^^^^^^ doesn't have a size known at compile-time | ^^^^^^ doesn't have a size known at compile-time
``` ```
编译器准确的告诉了我们原因:`str` 字符串切片它是 [`DST` 动态大小类型](https://course.rs/advance/custom-type.html#动态大小类型),这意味着编译器无法在编译期知道 `str` 类型的大小,只有到了运行期才能动态获知,这对于强类型、强安全的 Rust 语言来说是不可接受的。 编译器准确的告诉了我们原因:`str` 字符串切片它是 [`DST` 动态大小类型](https://course.rs/advance/into-types/sized.html#动态大小类型-dst),这意味着编译器无法在编译期知道 `str` 类型的大小,只有到了运行期才能动态获知,这对于强类型、强安全的 Rust 语言来说是不可接受的。
也就是说,我们无法直接使用 `str`,而对于 `[u8]` 也是类似的,大家可以自己动手试试。 也就是说,我们无法直接使用 `str`,而对于 `[u8]` 也是类似的,大家可以自己动手试试。
@ -69,7 +69,7 @@ let s3: &[i32] = &arr[1..3];
我们常常说使用切片,实际上我们在用的是切片的引用,我们也在频繁说使用字符串,实际上我们在使用的也是字符串切片的引用。 我们常常说使用切片,实际上我们在用的是切片的引用,我们也在频繁说使用字符串,实际上我们在使用的也是字符串切片的引用。
总之,切片在 Rust 中是动态类型 DST是无法被我们直接使用的而我们在使用的都是切片的引用。 总之,切片在 Rust 中是动态大小类型 DST是无法被我们直接使用的而我们在使用的都是切片的引用。
| 切片 | 切片引用 | | 切片 | 切片引用 |
| -------------- | --------------------- | | -------------- | --------------------- |

@ -8,7 +8,7 @@ Rust 语言的类型可以大致分为两种:基本类型和标准库类型,
## str ## str
如上所述,`str` 是唯一定义在 Rust 语言特性中的字符串,但是也是我们几乎不会用到的字符串类型,为何? 如上所述,`str` 是唯一定义在 Rust 语言特性中的字符串,但是也是我们几乎不会用到的字符串类型,为何?
原因在于 `str` 字符串它是 [`DST` 动态大小类型](https://course.rs/advance/custom-type.html#动态大小类型),这意味着编译器无法在编译期知道 `str` 类型的大小,只有到了运行期才能动态获知,这对于强类型、强安全的 Rust 语言来说是不可接受的。 原因在于 `str` 字符串它是 [`DST` 动态大小类型](https://course.rs/advance/into-types/sized.html#动态大小类型-dst),这意味着编译器无法在编译期知道 `str` 类型的大小,只有到了运行期才能动态获知,这对于强类型、强安全的 Rust 语言来说是不可接受的。
```rust ```rust
let string: str = "banana"; let string: str = "banana";
@ -28,7 +28,7 @@ error[E0277]: the size for values of type `str` cannot be known at compilation t
同时还是 String 和 &str 的底层数据类型。 由于 str 是动态 同时还是 String 和 &str 的底层数据类型。 由于 str 是动态
`str` 类型是硬编码进可执行文件,也无法被修改,但是 `String` 则是一个可增长、可改变且具有所有权的 UTF8 编码字符串,**当 Rust 用户提到字符串时,往往指的就是 `String` 类型和 `&str` 字符串切片类型,这两个类型都是 UTF8 编码**。 `str` 类型是硬编码进可执行文件,也无法被修改,但是 `String` 则是一个可增长、可改变且具有所有权的 UTF-8 编码字符串,**当 Rust 用户提到字符串时,往往指的就是 `String` 类型和 `&str` 字符串切片类型,这两个类型都是 UTF-8 编码**。
除了 `String` 类型的字符串Rust 的标准库还提供了其他类型的字符串,例如 `OsString` `OsStr` `CsString` 和` CsStr` 等,注意到这些名字都以 `String` 或者 `Str` 结尾了吗?它们分别对应的是具有所有权和被借用的变量。 除了 `String` 类型的字符串Rust 的标准库还提供了其他类型的字符串,例如 `OsString` `OsStr` `CsString` 和` CsStr` 等,注意到这些名字都以 `String` 或者 `Str` 结尾了吗?它们分别对应的是具有所有权和被借用的变量。

@ -154,7 +154,7 @@ enum Recursive {
} }
``` ```
这是典型的[动态大小类型](../advance/custom-type.md#动态大小类型),它的大小会无限增长,因此编译器会直接报错: 这是典型的[动态大小类型](../advance/into-types/sized.md#动态大小类型-dst),它的大小会无限增长,因此编译器会直接报错:
```shell ```shell
error[E0733]: recursion in an `async fn` requires boxing error[E0733]: recursion in an `async fn` requires boxing

@ -339,7 +339,7 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
因此在通过索引区间来访问字符串时,**需要格外的小心**,一不注意,就会导致你程序的崩溃! 因此在通过索引区间来访问字符串时,**需要格外的小心**,一不注意,就会导致你程序的崩溃!
## 操作 UTF8 字符串 ## 操作 UTF-8 字符串
前文提到了几种使用 UTF-8 字符串的方式,下面来一一说明。 前文提到了几种使用 UTF-8 字符串的方式,下面来一一说明。

@ -216,7 +216,7 @@ for item in collection {
} }
``` ```
上面代码对 1 到 3 的序列进行迭代,在遇到值为 2 时的跳出整个循环,后面的循环不执行,输出如下: 上面代码对 1 到 3 的序列进行迭代,在遇到值为 2 时的跳出整个循环,后面的循环不执行,输出如下:
```console ```console
1 1

@ -47,13 +47,15 @@
## B ## B
| 名称 | 关键字 | 简介 | | 名称 | 关键字 | 简介 |
| ----------- | --------- | -------------------------------------- | | ------------ | --------- | -------------------------------------- |
| [变量遮蔽] | shadowing | 允许声明相同的变量名,后者会遮蔽掉前者 | | [变量遮蔽] | shadowing | 允许声明相同的变量名,后者会遮蔽掉前者 |
| [变量作用域] | 所有权 | 作用域是一个变量在程序中有效的范围 |
| [表达式] | | 进行求值,结尾无 `;`,有返回值 | | [表达式] | | 进行求值,结尾无 `;`,有返回值 |
| [bool 布尔] | 布尔类型 | `true` `false`,占用 1 字节 | | [bool 布尔] | 布尔类型 | `true` `false`,占用 1 字节 |
| B | KWB | BIntroduction | | B | KWB | BIntroduction |
[变量遮蔽]: https://course.rs/basic/variable.html#变量遮蔽shadowing [变量遮蔽]: https://course.rs/basic/variable.html#变量遮蔽shadowing
[变量作用域]: https://course.rs/basic/ownership/ownership.html#变量作用域
[bool 布尔]: https://course.rs/basic/base-type/char-bool.html#布尔bool [bool 布尔]: https://course.rs/basic/base-type/char-bool.html#布尔bool
[表达式]: https://course.rs/basic/base-type/statement-expression.html#表达式 [表达式]: https://course.rs/basic/base-type/statement-expression.html#表达式
@ -62,13 +64,17 @@
## C ## C
| 名称 | 关键字 | 简介 | | 名称 | 关键字 | 简介 |
| ------------ | -------- | --------------------------------- | | ------------ | -------- | ----------------------------------------------------------------------------------- |
| [char 字符] | 字符类型 | 使用 `''` 表示,所有的 Unicode 值 | | [char 字符] | 字符类型 | 使用 `''` 表示,所有的 Unicode 值 |
| [const 常量] | constant | const MAX_POINTS: u32 = 100_000; | | [const 常量] | constant | const MAX_POINTS: u32 = 100_000; |
| [Copy 拷贝] | 浅拷贝 | 任何基本类型的组合可以 `Copy`,不需要分配内存或某种形式资源的类型是可以 `Copy` 的。 |
| [Clone 克隆] | 深拷贝 | 需要复制堆上的数据时,可以使用 `.clone()` 方法 |
| C | KWC | CIntroduction | | C | KWC | CIntroduction |
[char 字符]: https://course.rs/basic/base-type/char-bool.html#字符类型char [char 字符]: https://course.rs/basic/base-type/char-bool.html#字符类型char
[const 常量]: https://course.rs/basic/variable.html#变量和常量之间的差异 [const 常量]: https://course.rs/basic/variable.html#变量和常量之间的差异
[copy 拷贝]: https://course.rs/basic/ownership/ownership.html#拷贝浅拷贝
[clone 克隆]: https://course.rs/basic/ownership/ownership.html#克隆深拷贝
[back](#head) [back](#head)
@ -158,9 +164,12 @@
## M ## M
| 名称 | 关键字 | 简介 | | 名称 | 关键字 | 简介 |
| ---- | ------ | ------------- | | ----------- | ---------- | ----------------------------------------------------- |
| [move 移动] | 转移所有权 | `let s2 = s1;`<br>`s1` 所有权转移给了 `s2``s1` 失效 |
| M | KWM | MIntroduction | | M | KWM | MIntroduction |
[move 移动]: https://course.rs/basic/ownership/ownership.html#转移所有权
[back](#head) [back](#head)
## N ## N
@ -209,9 +218,14 @@
## S ## S
| 名称 | 关键字 | 简介 | | 名称 | 关键字 | 简介 |
| ---- | ------ | ------------- | | -------------- | ------ | ------------------------------------------------------------------------------------------------------ |
| [所有权与堆栈] | | Rust 所有权提供的强大保障 |
| [所有权原则] | | Rust 中每一个值都 `有且只有` 一个所有者(变量)<br> 当所有者(变量)离开作用域范围时,这个值将被丢弃(drop) |
| S | KWS | SIntroduction | | S | KWS | SIntroduction |
[所有权与堆栈]: https://course.rs/basic/ownership/ownership.html#所有权与堆栈
[所有权原则]: https://course.rs/basic/ownership/ownership.html#所有权原则
[back](#head) [back](#head)
## T ## T

Loading…
Cancel
Save