Rust 为什么我不能从闭包返回引用? fn main(){ let | ref|u in | ref|u out=| var:&i64 | var; }
这不会编译:Rust 为什么我不能从闭包返回引用? fn main(){ let | ref|u in | ref|u out=| var:&i64 | var; },rust,closures,lifetime,Rust,Closures,Lifetime,这不会编译: 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` |
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 i64{var}
但是作为结束我刚刚找到了解决这个问题的方法,但是如果有一个更简单的解决方案,那就太好了:
fn推断生命周期(f:f)->f{
F
}
fn main(){
让_ref_in _ref_out=推断生命周期(| var:&i64 | var);
}
生存期省略规则,也不能显式指定闭包的生存期。不过,有几种方法可以使此代码正常工作
最简单的解决方案是省略类型注释,让编译器推断所有内容:
let ref_in_ref_out = |var| var;
let i: i64 = 42;
ref_in_ref_out(&i);
或者,可以指定返回类型。这包括:
let _ref_in_ref_out = |var| -> &i64 { var };
对于闭包不关闭任何局部变量的情况,另一种选择是将其转换为函数指针,因为生命周期省略规则适用于函数指针:
let ref_in_ref_out: fn(&i64) -> &i64 = |var| var;
最后,最通用的解决方案是使用helper函数将函数特性绑定到闭包:
fn constrain_closure<F: Fn(&i64) -> &i64>(f: F) -> F {
f
}
let _ref_in_ref_out = constrain_closure(|var| var);
fn约束闭包&i64>(f:f)->f{
F
}
让_ref_in _ref_out=constraint_闭包(| var | var);
注意,这也会在没有显式生命周期参数的情况下编译,但是对于&'aI64闭包,您会得到更一般的绑定。此答案中的代码将导致一个闭包,该闭包在一个特定的推断生存期内有效。依赖生存期省略会导致闭包适用于任何生存期'a
,因此可以使用不同的生存期调用闭包。