fn main() {
let _ref_in_ref_out = |var: &i64| var;
}
以下代码无法编译:
error: lifetime may not live long enough
--> src/main.rs:2:39
|
2 | let _ref_in_ref_out = |var: &i64| var;
| - - ^^^ returning this value requires that `'1` must outlive `'2`
| | |
| | return type of closure is &'2 i64
| let's call the lifetime of this reference `'1`
显然,编译器推断出两个不同的生命周期(分别适用于参数和返回类型),而不是相同的生命周期。
是否有可能编写一个闭包,使输入生命周期与输出生命周期相同?
例如:
fn ref_in_ref_out<'a> (var: &'a i64) -> &'a i64 { var }
但是作为一个闭包
for<'a> Fn(&'a i64) -> &'a i64
。本答案中的代码生成一个适用于特定推断生命周期的闭包。依赖于生命周期省略会导致闭包适用于任何生命周期'a
,因此该闭包可以使用不同的生命周期进行调用。 - Sven Marnach