From ec43455db9681c22ec714d1d6ee467d0ae3864e2 Mon Sep 17 00:00:00 2001 From: Unisko PENG Date: Thu, 20 Apr 2023 14:51:56 +0800 Subject: [PATCH] Update Ch10 --- src/Ch10_Generic_Types_Traits_and_Lifetimes.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Ch10_Generic_Types_Traits_and_Lifetimes.md b/src/Ch10_Generic_Types_Traits_and_Lifetimes.md index 0393b42..74bab70 100644 --- a/src/Ch10_Generic_Types_Traits_and_Lifetimes.md +++ b/src/Ch10_Generic_Types_Traits_and_Lifetimes.md @@ -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 就有了足够信息,来放行一些涉及内存安全的操作,以及蓝星那些会创建出悬空指针或其他危及内存安全的操作。