mirror of
https://github.com/gnu4cn/rust-lang-zh_CN.git
synced 2025-03-14 11:20:29 +08:00
Update Ch10
This commit is contained in:
parent
0b1392adf9
commit
0f9a9008d1
@ -1217,7 +1217,7 @@ error: could not compile `lifetimes_demo` due to previous error; 2 warnings emit
|
||||
**Lifetime Annotations in Struct Definitions**
|
||||
|
||||
|
||||
到目前为止,本书中业已定义的那些结构体,都持有自己的一些类型。这里可以将结构体定义为持有一些引用,但这样的话,就需要在结构体定义中每个引用上,添加生命周期注解了。下面清单 10-24 有着一个名为 `ImportedExcerpt`、保存着一个字符串切片的结构体。
|
||||
到目前为止,咱们曾定义的结构体,都保存着一些自有类型。咱们可定义出保存引用的结构体,但那样的话,咱们将需要在结构体定义中的每个引用上,添加生命周期注解。下面清单 10-24 有个名为 `ImportedExcerpt`,保存着一个字符串切片的结构体。
|
||||
|
||||
文件名:`src/main.rs`
|
||||
|
||||
@ -1235,18 +1235,18 @@ fn main() {
|
||||
}
|
||||
```
|
||||
|
||||
*清单 10-24:保存了一个引用的结构体,因此就需要生命周期注解*
|
||||
*清单 10-24:保存着一个引用的结构体,因此就需要生命周期注解*
|
||||
|
||||
此结构体有着单个的、保存着一个字符串切片,因此是个引用变量的字段 `part`。与通用数据类型(generic data types)之下一样,这里在结构他名字后面,尖括号里头,对其中的通用声明周期参赛进行了声明,进而就可以在这个结构体定义代码体中,使用那个生命周期参数。这样的注解表示,`ImportantExcerpt` 的实例,无法存活过超出保存在其 `part` 字段中引用的生命早期。
|
||||
此结构体拥有保存着是个引用的字符串切片的单一字段 `part`。与通用数据类型(泛型),generic data types,下一样,咱们在结构他名字后的尖括号里,声明了通用声明周期参数,进而就可以在结构体定义代码体中,使用那个生命周期参数。这个注解表示,`ImportantExcerpt` 的实例,无法存活超过其在 `part` 字段中所保存的那个引用,this annotation means an instance of `ImportedExcerpt` can't outlive the reference it holds in its `part` field。
|
||||
|
||||
这里的 `main` 函数创建了该 `ImportantExcerpt` 的一个实例,该实例保存了到其中由变量 `novel` 所拥有所有权的 `String` 第一句话的引用。`novel` 中的数据,在该 `ImportantExcerpt` 实例被创建之前,便存在了。此外,`novel` 在这个 `ImportantExcerpt` 超出作用域之前,并未超出作用域,因此在这个 `ImportantExcerpt` 实例中的引用,将有效。
|
||||
这里的 `main` 函数会创建出 `ImportantExcerpt` 结构体的,保存着到由变量 `novel` 拥有的 `String` 的第一个句子引用的一个示例。`novel` 中的数据在这个 `ImportantExcerpt` 实例被创建之前就存在了。此外,在这个 `ImportantExcerpt` 超出作用域之前,`novel` 不会超出作用域,因此这个 `ImportantExcerpt` 实例中的引用是有效的。
|
||||
|
||||
|
||||
### 生命周期的省略
|
||||
|
||||
**Lifetime Elision**
|
||||
|
||||
现在已经了解到每个引用都有生命周期,以及需要给使用到引用的函数与结构体,指明生命周期参数。不过,在第 4 章中,曾有一个清单 4-9 中的函数,这里再次将其展示在下面清单 10-25 中,这是个不带生命周期注解就被编译的函数。
|
||||
咱们已经了解到每个引用都有生命周期,以及需要给使用了引用的函数与结构体,指明生命周期参数。不过,在第 4 章中的清单 4-9 中,咱们曾有一个不带生命周期注解也被编译了的函数,在下面清单 10-25 中再次予以展示。
|
||||
|
||||
|
||||
文件名:`src/main.rs`
|
||||
@ -1265,10 +1265,10 @@ fn first_word(s: &String) -> &str {
|
||||
}
|
||||
```
|
||||
|
||||
*清单 10-25:在清单 4-9 中曾定义的一个不带生命周期注解即被编译的函数,即使其参数与返回值均为引用变量*
|
||||
*清单 10-25:咱们曾在清单 4-9 中定义的一个即使其中的参数与返回值均为引用变量,而不带生命周期注解还仍编译了的函数*
|
||||
|
||||
|
||||
此函数不带生命周期注解即会编译的原因,是历史遗留的:在 Rust 早期版本(`pre-1.0`)中,由于每个引用都需要显式生命周期,因此该代码就不会编译。那个时候,该函数签名就会被写成下面这样:
|
||||
这个函数不带生命周期注解仍会编译的原因,是历史遗留的:在 Rust 早期版本(`pre-1.0`)中,由于每个引用都需要显式生命周期,因此该代码就不会编译。那个时候,该函数签名会被写成下面这样:
|
||||
|
||||
```rust
|
||||
fn first_word<'a>(s: &'a str) -> &'a str {
|
||||
|
Loading…
Reference in New Issue
Block a user