enhance:增补Rust所有权文章。

This commit is contained in:
徐涛 2022-04-01 11:00:36 +08:00
parent 5329767b0e
commit 32656236bb

View File

@ -327,8 +327,8 @@ fn f(p: &'static i32) {
```rust ```rust
fn largest(arr: &[i32]) -> &i32 { fn largest(arr: &[i32]) -> &i32 {
let mut s = &v[0]; let mut s = &arr[0];
for r in &v[1..] { for r in &arr[1..] {
if *r > *s { if *r > *s {
s = r; s = r;
} }
@ -337,11 +337,23 @@ fn largest(arr: &[i32]) -> &i32 {
} }
``` ```
这个示例主表达了在Rust中如果一个函数接受一个引用作为参数并返回一个引用的时候Rust会假设两个引用会具有相同的生命期。这个函数的完整写法是下面这样的。 这个示例主表达了在Rust中如果一个函数接受一个引用作为参数并返回一个引用的时候Rust会假设两个引用会具有相同的生命期。这个函数的完整写法是下面这样的。
```rust ```rust
fn largest<'a>(arr: &'a [i32]) -> &'a i32 { fn largest<'a>(arr: &'a [i32]) -> &'a i32 {
// ... 'b: {
let mut s = &'a arr[0];
for r in &arr[1..] {
'c: {
if *r > *s {
s = r;
}
}
}
// s在这里的生命期属于'b但其指向的地址的生命期属于'a
// 所以移交所有权是没有问题的,但是如果改成移交引用,就会出现问题
s
}
} }
``` ```