From 32656236bb0b1145320d7af9daeb842f7368cafc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B6=9B?= Date: Fri, 1 Apr 2022 11:00:36 +0800 Subject: [PATCH] =?UTF-8?q?enhance:=E5=A2=9E=E8=A1=A5Rust=E6=89=80?= =?UTF-8?q?=E6=9C=89=E6=9D=83=E6=96=87=E7=AB=A0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/_posts/rust-ownership.md | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) 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 + } } ```