mirror of
https://github.com/gnu4cn/rust-lang-zh_CN.git
synced 2025-01-31 14:40:12 +08:00
Update Ch10
This commit is contained in:
parent
266a7d8386
commit
ec43455db9
@ -1180,7 +1180,7 @@ fn longest<'a>(x: &'a str, y: &str) -> &'a str {
|
||||
|
||||
咱们已为参数 `x` 与返回值类型,指定了生命周期参数 `'a`,而由于参数 `y` 的生命周期,与 `x` 或返回值的生命周期并无任何关系,故咱们并未将 `'a` 指定给参数 `y`。
|
||||
|
||||
当从函数返回引用时,返回值类型的生命周期参数,就需要匹配某个参数的生命周期参数。而在返回的引用,*未* 指向某个参数时,那么他就必须指向在该函数内部创建的某个值。然而,由于这个函数内部创建的值,在函数结束处将超出作用域,因此这就会是个悬空引用了。请设想下面这个不会编译的尝试性 `longest` 函数实现:
|
||||
当从函数返回引用时,返回值类型的生命周期参数,就需要匹配某个参数的生命周期参数。而当返回的引用 *不* 指向某个参数时,其就必定会指向函数内部创建出的某个值。然而,由于该值在函数结束处将超出作用域,因此这就会是个悬空引用。请设想下面这个不会编译的 `longest` 函数尝试实现:
|
||||
|
||||
文件名:`src/main.rs`
|
||||
|
||||
@ -1191,7 +1191,7 @@ fn longest<'a>(x: &str, y: &str) -> &'a str {
|
||||
}
|
||||
```
|
||||
|
||||
这里尽管已给那个返回类型指定了生命周期参数 `'a`,但由于其中的返回值生命周期,与那些参数的生命周期毫无关系,故该实现将编译失败。下面就是得到的错误消息:
|
||||
这里,尽管咱们已为返回类型指定了生命周期参数 `'a`,但由于返回值生命周期与参数的生命周期毫无关系,故这个实现将编译失败。下面是咱们会得到的报错:
|
||||
|
||||
```console
|
||||
$ cargo run lennyp@vm-manjaro
|
||||
@ -1207,7 +1207,7 @@ warning: `lifetimes_demo` (bin "lifetimes_demo") generated 2 warnings
|
||||
error: could not compile `lifetimes_demo` due to previous error; 2 warnings emitted
|
||||
```
|
||||
|
||||
问题就是在 `longest` 函数结束处,`result` 就超出了作用域而被清理掉了。这里还在尝试从该函数返回到 `result` 的一个引用。并不存在能够指定一个会改变这个悬空引用的生命周期参数的办法,而 Rust 也不会容许创建悬空引用。在此示例中,最佳修复将是返回一个有着所有权的数据类型,而非某个引用(注:故引用是没有所有权的),进而随后由调用函数(the calling function),来负责清理该值。
|
||||
问题在于,那个 `result` 会在 `longest` 函数结束处超出作用域而被清理掉。而咱们还在尝试返回到该函数中 `result` 的引用。咱们没有办法指定出会纠正这个悬空引用的生命周期参数,而 Rust 也不会容许咱们创建出悬空引用。在这种情况下,最佳修复将是返回有着所有权的数据类型,而非某个引用(注:这样看来引用是没有所有权的),从而随后由调用函数,the calling function,负责清理该值。
|
||||
|
||||
最后,生命周期语法,是有关将函数各个参数的生命周期,与函数返回值的生命周期连接起来的。一旦他们连接了起来,那么 Rust 就有了足够信息,来放行一些涉及内存安全的操作,以及蓝星那些会创建出悬空指针或其他危及内存安全的操作。
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user