From 07c033c8003dd74a3760537b714f981ece64813d Mon Sep 17 00:00:00 2001 From: Ykong <66518156+Ykong1337@users.noreply.github.com> Date: Wed, 21 Dec 2022 14:04:57 +0800 Subject: [PATCH] Update advance.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 解决闭包不遵循生命周期消除规则问题 --- src/advance/lifetime/advance.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/advance/lifetime/advance.md b/src/advance/lifetime/advance.md index 37f5e126..2c759bc5 100644 --- a/src/advance/lifetime/advance.md +++ b/src/advance/lifetime/advance.md @@ -234,7 +234,19 @@ error: lifetime may not live long enough 真的是非常奇怪的错误,学过上一节的读者应该都记得这样一条生命周期消除规则:**如果函数参数中只有一个引用类型,那该引用的生命周期会被自动分配给所有的返回引用**。我们当前的情况完美符合, `function` 函数的顺利编译通过,就充分说明了问题。 -首先给出一个结论:**这个问题,可能很难被解决,建议大家遇到后,还是老老实实用正常的函数,不要秀闭包了**。 +**最好的解决方案**: 通过包装一层Fn Trait来解决。 + +```rust +fn main() { + let closure_slision = fun(|x: &i32| -> &i32 { x }); + assert_eq!(*closure_slision(&45), 45); + // Passed ! +} + +fn fun &T>(f: F) -> F { + f +} +``` 对于函数的生命周期而言,它的消除规则之所以能生效是因为它的生命周期完全体现在签名的引用类型上,在函数体中无需任何体现: