From 3020159afe93b5f77658ccd0c4330051365e4ef2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BE=E5=B0=8F=E5=83=A7?= Date: Fri, 18 Mar 2022 18:10:43 +0800 Subject: [PATCH 1/3] Add more understandable explanations. --- src/advance/lifetime/advance.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/advance/lifetime/advance.md b/src/advance/lifetime/advance.md index 014fdf5c..41f07856 100644 --- a/src/advance/lifetime/advance.md +++ b/src/advance/lifetime/advance.md @@ -77,6 +77,8 @@ fn main() { 这就解释了可变借用为啥会在 `main` 函数作用域内有效,最终导致 `foo.share()` 无法再进行不可变借用。 +简单点说,在 Rust 中**引用作用域持续到最后一次使用后失效**,`loan` 的作用域来自可变引用 `&mut foo` 且持续到 `println` 结束后,而在此期间 `foo.share()` 又进行了一次不可变 `&foo` 引用,违法了借用规则可变引用与不可变引用不能同时存在,因此编译器不能编译通过。 + 上述代码实际上完全是正确的,但是因为生命周期系统的“粗糙实现”,导致了编译错误,目前来说,遇到这种生命周期系统不够聪明导致的编译错误,我们也没有太好的办法,只能修改代码去满足它的需求,并期待以后它会更聪明。 #### 例子 2 From ee08b21d8a2863b509abeb735403e92ec5a3ad77 Mon Sep 17 00:00:00 2001 From: Sunface Date: Sun, 20 Mar 2022 21:16:22 +0800 Subject: [PATCH 2/3] Update src/advance/lifetime/advance.md --- src/advance/lifetime/advance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/advance/lifetime/advance.md b/src/advance/lifetime/advance.md index 41f07856..55a1a127 100644 --- a/src/advance/lifetime/advance.md +++ b/src/advance/lifetime/advance.md @@ -77,7 +77,7 @@ fn main() { 这就解释了可变借用为啥会在 `main` 函数作用域内有效,最终导致 `foo.share()` 无法再进行不可变借用。 -简单点说,在 Rust 中**引用作用域持续到最后一次使用后失效**,`loan` 的作用域来自可变引用 `&mut foo` 且持续到 `println` 结束后,而在此期间 `foo.share()` 又进行了一次不可变 `&foo` 引用,违法了借用规则可变引用与不可变引用不能同时存在,因此编译器不能编译通过。 +总结下:`&mut self` 借用得生命周期和 `loan` 的生命周期相同,而后者将持续到 `println` 结束。而在此期间 `foo.share()` 又进行了一次不可变 `&foo` 借用,违背了可变借用与不可变借用不能同时存在的规则,最终导致了编译错误。 上述代码实际上完全是正确的,但是因为生命周期系统的“粗糙实现”,导致了编译错误,目前来说,遇到这种生命周期系统不够聪明导致的编译错误,我们也没有太好的办法,只能修改代码去满足它的需求,并期待以后它会更聪明。 From 3c0eb826d2c1f099524c657626327c58bcfde7e5 Mon Sep 17 00:00:00 2001 From: Sunface Date: Sun, 20 Mar 2022 21:17:09 +0800 Subject: [PATCH 3/3] Update src/advance/lifetime/advance.md --- src/advance/lifetime/advance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/advance/lifetime/advance.md b/src/advance/lifetime/advance.md index 55a1a127..86bfeabd 100644 --- a/src/advance/lifetime/advance.md +++ b/src/advance/lifetime/advance.md @@ -77,7 +77,7 @@ fn main() { 这就解释了可变借用为啥会在 `main` 函数作用域内有效,最终导致 `foo.share()` 无法再进行不可变借用。 -总结下:`&mut self` 借用得生命周期和 `loan` 的生命周期相同,而后者将持续到 `println` 结束。而在此期间 `foo.share()` 又进行了一次不可变 `&foo` 借用,违背了可变借用与不可变借用不能同时存在的规则,最终导致了编译错误。 +总结下:`&mut self` 借用的生命周期和 `loan` 的生命周期相同,将持续到 `println` 结束。而在此期间 `foo.share()` 又进行了一次不可变 `&foo` 借用,违背了可变借用与不可变借用不能同时存在的规则,最终导致了编译错误。 上述代码实际上完全是正确的,但是因为生命周期系统的“粗糙实现”,导致了编译错误,目前来说,遇到这种生命周期系统不够聪明导致的编译错误,我们也没有太好的办法,只能修改代码去满足它的需求,并期待以后它会更聪明。