diff --git a/source/_posts/rust-ownership.md b/source/_posts/rust-ownership.md index 60b9251..0227ce5 100644 --- a/source/_posts/rust-ownership.md +++ b/source/_posts/rust-ownership.md @@ -327,8 +327,8 @@ fn f(p: &'static i32) { ```rust fn largest(arr: &[i32]) -> &i32 { - let mut s = &v[0]; - for r in &v[1..] { + let mut s = &arr[0]; + for r in &arr[1..] { if *r > *s { s = r; } @@ -337,11 +337,23 @@ fn largest(arr: &[i32]) -> &i32 { } ``` -这个示例主语表达了在Rust中,如果一个函数接受一个引用作为参数并返回一个引用的时候,Rust会假设两个引用会具有相同的生命期。这个函数的完整写法是下面这样的。 +这个示例主要表达了在Rust中,如果一个函数接受一个引用作为参数并返回一个引用的时候,Rust会假设两个引用会具有相同的生命期。这个函数的完整写法是下面这样的。 ```rust 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 + } } ```