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
,因此可以使用不同的生存期调用闭包。