doc: Optimize the description at ch10-03

This commit is contained in:
YangQi 2022-01-14 18:46:46 +08:00
parent ce9f2e0342
commit 59a4753d65

View File

@ -25,7 +25,7 @@
> 注意:示例 10-17、10-18 和 10-24 中声明了没有初始值的变量,所以这些变量存在于外部作用域。这乍看之下好像和 Rust 不允许存在空值相冲突。然而如果尝试在给它一个值之前使用这个变量,会出现一个编译时错误,这就说明了 Rust 确实不允许空值。
外部作用域声明了一个没有初值的变量 `r`,而内部作用域声明了一个初值为 5 的变量`x`。在内部作用域中,我们尝试将 `r` 的值设置为一个 `x` 的引用。接着在内部作用域结束后,尝试打印出 `r` 的值。这段代码不能编译因为 `r` 引用的值在尝试使用之前就离开了作用域。如下是错误信息:
外部作用域声明了一个没有初值的变量 `r`,而内部作用域声明了一个初值为 5 的变量 `x`。在内部作用域中,我们尝试将 `r` 的值设置为一个 `x` 的引用。接着在内部作用域结束后,尝试打印出 `r` 的值。这段代码不能编译因为 `r` 引用的值在尝试使用之前就离开了作用域。如下是错误信息:
```text
error[E0597]: `x` does not live long enough
@ -84,7 +84,7 @@ Rust 编译器有一个 **借用检查器***borrow checker*),它比较作
### 函数中的泛型生命周期
让我们来编写一个返回两个字符串 slice 中较长者的函数。这个函数获取两个字符串 slice 并返回一个字符串 slice。一旦我们实现了 `longest` 函数,示例 10-20 中的代码应该会打印出 `The longest string is abcd`
让我们来编写一个函数,返回两个字符串 slice 中较长的那一个。这个函数获取两个字符串 slice 并返回一个字符串 slice。一旦我们实现了 `longest` 函数,示例 10-20 中的代码应该会打印出 `The longest string is abcd`
<span class="filename">文件名: src/main.rs</span>
@ -100,9 +100,9 @@ fn main() {
<span class="caption">示例 10-20`main` 函数调用 `longest` 函数来寻找两个字符串 slice 中较长的一个</span>
注意这个函数获取作为引用的字符串 slice因为我们不希望 `longest` 函数获取参数的所有权。我们期望该函数接受 `String` 的 slice参数 `string1` 的类型)和字符串字面值(包含于参数 `string2`
注意这个函数获取作为引用的字符串 slice因为我们不希望 `longest` 函数获取参数的所有权。我们期望该函数接受 `String` 的 slice参数 `string1` 的类型)和字符串字面值(包含于参数 `string2`
参考之前第四章中的 [“字符串 slice 作为参数”][string-slices-as-parameters] 部分中更多关于为什么示例 10-20 的参数正符合我们期望的讨论。
参考第四章中的 [“字符串 slice 作为参数”][string-slices-as-parameters] 部分中更多关于为什么示例 10-20 的参数正符合我们期望的讨论。
如果尝试像示例 10-21 中那样实现 `longest` 函数,它并不能编译:
@ -151,7 +151,7 @@ signature does not say whether it is borrowed from `x` or `y`
&'a mut i32 // 带有显式生命周期的可变引用
```
单个生命周期注解本身没有多少意义,因为生命周期注解告诉 Rust 多个引用的泛型生命周期参数如何相互联系的。例如如果函数有一个生命周期 `'a``i32` 的引用的参数 `first`。还有另一个同样是生命周期 `'a``i32` 的引用的参数 `second`。这两个生命周期注解意味着引用 `first``second` 必须与这泛型生命周期存在得一样久。
单个生命周期注解本身没有多少意义,因为生命周期注解告诉 Rust 多个引用的泛型生命周期参数如何相互联系的。例如如果函数有一个生命周期 `'a``i32` 的引用的参数 `first`。还有另一个同样是生命周期 `'a``i32` 的引用的参数 `second`。这两个生命周期注解意味着引用 `first``second` 必须与这泛型生命周期存在得一样久。
### 函数签名中的生命周期注解
@ -366,7 +366,7 @@ fn first_word<'a>(s: &'a str) -> &'a str {
第二条规则是如果只有一个输入生命周期参数,那么它被赋予所有输出生命周期参数:`fn foo<'a>(x: &'a i32) -> &'a i32`。
第三条规则是如果方法有多个输入生命周期参数并且其中一个参数是 `&self``&mut self`,说明是个对象的方法(method)(译者注: 这里涉及rust的面向对象参见17章), 那么所有输出生命周期参数被赋予 `self` 的生命周期。第三条规则使得方法更容易读写,因为只需更少的符号。
第三条规则是如果方法有多个输入生命周期参数并且其中一个参数是 `&self``&mut self`,说明是个对象的方法(method)(译者注: 这里涉及 Rust 的面向对象参见 17 章), 那么所有输出生命周期参数被赋予 `self` 的生命周期。第三条规则使得方法更容易读写,因为只需更少的符号。
假设我们自己就是编译器。并应用这些规则来计算示例 10-26 中 `first_word` 函数签名中的引用的生命周期。开始时签名中的引用并没有关联任何生命周期: