Update Ch10

This commit is contained in:
Peng Hailin, 2023-04-20 07:50:06 +08:00
parent 743d97f30f
commit 3ee25c4634

View File

@ -1072,9 +1072,9 @@ fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
当于函数中注解生命周期时这些注解是在函数签名中而非函数体中。生命周期注解成为了该函数合约的一部分这就很像是签名中的类型。令函数签名包含生命周期合约the lifetime contract就意味着 Rust 编译器执行的分析,会更简单。若函数被注解方式或被调用方式存在问题,那么编译器报错,就可以更精准地指向所编写代码或约束的某个部分。相反,若没有这些生命周期注解,那么相比于 Rust 编译器会作出更多有关咱们所预期的生命周期关系推断编译器或许就只能够指出在问题原因处许多步之外咱们代码的某个使用if, instead, the Rust compiler made more inferences about what we intended the relationships of the lifetimes to be, the compiler might only be able to point to a use of our code many steps away from the cause of the problem。
将具体引用传递给 `longest` 时,取代 `'a` 的那个具体生命周期,即为参数 `x` 作用域与参数 `y` 作用域重叠的部分。也就是说,这个泛型生命周期 `'a` 将获取到,与 `x``y` 生命周期中较小那个相等的具体生命周期。由于这里已将那个返回的引用,注解为了同一生命周期参数 `'a`,那么那个返回的引用,就会在 `x``y` 的生命周期中较小那个的长度期间有效。
咱们把具体引用传递给 `longest` 时,取代 `'a` 的具体生命周期,便是 `x` 的作用域中,与 `y` 的作用域重叠的部分。也就是说,泛型生命周期 `'a` 将获得,等于 `x``y` 的生命周期中较小者的具体生命周期。由于咱们已使用同一生命周期参数 `'a`,注解了返回的引用,因此返回的引用,就会在 `x``y` 的生命周期中较小者的存活时长期间有效。
下面就来通过传入有着不同具体生命周期的引用,而看看这些生命周期注解,是怎样对这个 `longest` 函数加以限制的。下面清单 10-22 就是一个直观的示例。
下面咱们来通过传入具有不同具体生命周期的引用,看一下生命周期注解,如何限制 `longest` 函数。下面清单 10-22 就是一个直观的示例。
文件名:`src/main.rs`
@ -1099,10 +1099,10 @@ fn main() {
}
```
*清单 10-22在到有着不同具体生命周期 `String` 类型值的引用下,运用这个 `longest` 函数*
*清单 10-22以到具有不同具体生命周期的 `String` 类型值的一些引用,使用 `longest` 函数*
在此示例中,到外层作用域结束之前,`string1` 都是有效的,而 `string2` 则是到内层作用域结束之前为有效,同时 `result` 引用了某个在内层作用域结束之前有效的东西。运行此代码,就会看到借用检查器通过了检查;此代码将编译并打印 `最长的字符串为 长字符串就是长`
在此示例中,`string1` 到外层作用域结束之前都有效,`string2` 到内层作用域结束之前有效,而 `result` 引用了在内层作用域结束之前有效的某个东西。运行此代码,咱们就会看到借用检查器予以了证实;此代码将编译并打印 `最长的字符串为 长字符串就是长`
接下来,就要尝试一个展示 `result` 中引用的生命周期,必须为这两个参数生命周期中较小的那个的示例。这里将把那个 `result` 变量的声明,移到内层作用域外面而将到该 `result` 变量的赋值,仍然留在有着 `string2` 变量的作用域里头。随后将把那个用到 `result` 变量的 `println!` 语句,移出到内层作用域外面,在内层作用域结束之后。下面清单 10-23 中的代码就不会编译了。