diff --git a/README.md b/README.md index f7583960..6f845e30 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@

Rust语言圣经

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

Rust语言圣经

- +
diff --git a/src/advance/confonding/slice.md b/src/advance/confonding/slice.md index 1abd097f..fab21e07 100644 --- a/src/advance/confonding/slice.md +++ b/src/advance/confonding/slice.md @@ -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 ``` -编译器准确的告诉了我们原因:`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]` 也是类似的,大家可以自己动手试试。 @@ -69,7 +69,7 @@ let s3: &[i32] = &arr[1..3]; 我们常常说使用切片,实际上我们在用的是切片的引用,我们也在频繁说使用字符串,实际上我们在使用的也是字符串切片的引用。 -总之,切片在 Rust 中是动态类型 DST,是无法被我们直接使用的,而我们在使用的都是切片的引用。 +总之,切片在 Rust 中是动态大小类型 DST,是无法被我们直接使用的,而我们在使用的都是切片的引用。 | 切片 | 切片引用 | | -------------- | --------------------- | diff --git a/src/advance/confonding/string.md b/src/advance/confonding/string.md index 640a1e95..9111e1fc 100644 --- a/src/advance/confonding/string.md +++ b/src/advance/confonding/string.md @@ -8,7 +8,7 @@ Rust 语言的类型可以大致分为两种:基本类型和标准库类型, ## str 如上所述,`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 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 是动态 -`str` 类型是硬编码进可执行文件,也无法被修改,但是 `String` 则是一个可增长、可改变且具有所有权的 UTF8 编码字符串,**当 Rust 用户提到字符串时,往往指的就是 `String` 类型和 `&str` 字符串切片类型,这两个类型都是 UTF8 编码**。 +`str` 类型是硬编码进可执行文件,也无法被修改,但是 `String` 则是一个可增长、可改变且具有所有权的 UTF-8 编码字符串,**当 Rust 用户提到字符串时,往往指的就是 `String` 类型和 `&str` 字符串切片类型,这两个类型都是 UTF-8 编码**。 除了 `String` 类型的字符串,Rust 的标准库还提供了其他类型的字符串,例如 `OsString`, `OsStr`, `CsString` 和` CsStr` 等,注意到这些名字都以 `String` 或者 `Str` 结尾了吗?它们分别对应的是具有所有权和被借用的变量。 diff --git a/src/async-rust/async/pain-points-and-workarounds.md b/src/async-rust/async/pain-points-and-workarounds.md index ba512253..1b536dfa 100644 --- a/src/async-rust/async/pain-points-and-workarounds.md +++ b/src/async-rust/async/pain-points-and-workarounds.md @@ -154,7 +154,7 @@ enum Recursive { } ``` -这是典型的[动态大小类型](../advance/custom-type.md#动态大小类型),它的大小会无限增长,因此编译器会直接报错: +这是典型的[动态大小类型](../advance/into-types/sized.md#动态大小类型-dst),它的大小会无限增长,因此编译器会直接报错: ```shell error[E0733]: recursion in an `async fn` requires boxing diff --git a/src/basic/compound-type/string-slice.md b/src/basic/compound-type/string-slice.md index 6fcd009e..90f8fd6b 100644 --- a/src/basic/compound-type/string-slice.md +++ b/src/basic/compound-type/string-slice.md @@ -339,7 +339,7 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace 因此在通过索引区间来访问字符串时,**需要格外的小心**,一不注意,就会导致你程序的崩溃! -## 操作 UTF8 字符串 +## 操作 UTF-8 字符串 前文提到了几种使用 UTF-8 字符串的方式,下面来一一说明。 diff --git a/src/basic/flow-control.md b/src/basic/flow-control.md index 3890a120..f9ed7085 100644 --- a/src/basic/flow-control.md +++ b/src/basic/flow-control.md @@ -216,7 +216,7 @@ for item in collection { } ``` -上面代码对 1 到 3 的序列进行迭代,在遇到值为 2 时的跳出整个循环,后面的循环不在执行,输出如下: +上面代码对 1 到 3 的序列进行迭代,在遇到值为 2 时的跳出整个循环,后面的循环不再执行,输出如下: ```console 1 diff --git a/src/index-list.md b/src/index-list.md index 954b3b99..8f51e7fe 100644 --- a/src/index-list.md +++ b/src/index-list.md @@ -46,14 +46,16 @@ ## B -| 名称 | 关键字 | 简介 | -| ----------- | --------- | -------------------------------------- | -| [变量遮蔽] | shadowing | 允许声明相同的变量名,后者会遮蔽掉前者 | -| [表达式] | | 进行求值,结尾无 `;`,有返回值 | -| [bool 布尔] | 布尔类型 | `true` `false`,占用 1 字节 | -| B | KWB | BIntroduction | +| 名称 | 关键字 | 简介 | +| ------------ | --------- | -------------------------------------- | +| [变量遮蔽] | shadowing | 允许声明相同的变量名,后者会遮蔽掉前者 | +| [变量作用域] | 所有权 | 作用域是一个变量在程序中有效的范围 | +| [表达式] | | 进行求值,结尾无 `;`,有返回值 | +| [bool 布尔] | 布尔类型 | `true` `false`,占用 1 字节 | +| B | KWB | BIntroduction | [变量遮蔽]: 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 [表达式]: https://course.rs/basic/base-type/statement-expression.html#表达式 @@ -61,14 +63,18 @@ ## C -| 名称 | 关键字 | 简介 | -| ------------ | -------- | --------------------------------- | -| [char 字符] | 字符类型 | 使用 `''` 表示,所有的 Unicode 值 | -| [const 常量] | constant | const MAX_POINTS: u32 = 100_000; | -| C | KWC | CIntroduction | +| 名称 | 关键字 | 简介 | +| ------------ | -------- | ----------------------------------------------------------------------------------- | +| [char 字符] | 字符类型 | 使用 `''` 表示,所有的 Unicode 值 | +| [const 常量] | constant | const MAX_POINTS: u32 = 100_000; | +| [Copy 拷贝] | 浅拷贝 | 任何基本类型的组合可以 `Copy`,不需要分配内存或某种形式资源的类型是可以 `Copy` 的。 | +| [Clone 克隆] | 深拷贝 | 需要复制堆上的数据时,可以使用 `.clone()` 方法 | +| C | KWC | CIntroduction | [char 字符]: https://course.rs/basic/base-type/char-bool.html#字符类型char [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) @@ -157,9 +163,12 @@ ## M -| 名称 | 关键字 | 简介 | -| ---- | ------ | ------------- | -| M | KWM | MIntroduction | +| 名称 | 关键字 | 简介 | +| ----------- | ---------- | ----------------------------------------------------- | +| [move 移动] | 转移所有权 | `let s2 = s1;`
`s1` 所有权转移给了 `s2`,`s1` 失效 | +| M | KWM | MIntroduction | + +[move 移动]: https://course.rs/basic/ownership/ownership.html#转移所有权 [back](#head) @@ -208,9 +217,14 @@ ## S -| 名称 | 关键字 | 简介 | -| ---- | ------ | ------------- | -| S | KWS | SIntroduction | +| 名称 | 关键字 | 简介 | +| -------------- | ------ | ------------------------------------------------------------------------------------------------------ | +| [所有权与堆栈] | | Rust 所有权提供的强大保障 | +| [所有权原则] | | Rust 中每一个值都 `有且只有` 一个所有者(变量)
当所有者(变量)离开作用域范围时,这个值将被丢弃(drop) | +| S | KWS | SIntroduction | + +[所有权与堆栈]: https://course.rs/basic/ownership/ownership.html#所有权与堆栈 +[所有权原则]: https://course.rs/basic/ownership/ownership.html#所有权原则 [back](#head)