Merge pull request #1117 from Ykong1337/main

解决闭包不遵循生命周期消除规则问题
pull/1124/head
Sunface 2 years ago committed by GitHub
commit 7a9fc8f70c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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: Fn(&T) -> &T>(f: F) -> F {
f
}
```
对于函数的生命周期而言,它的消除规则之所以能生效是因为它的生命周期完全体现在签名的引用类型上,在函数体中无需任何体现:

Loading…
Cancel
Save