rust - 为什么我不能从闭包返回引用?

标签 rust closures lifetime

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 }
但作为一个闭包

最佳答案

终身省略规则 do not apply to closures ,您也不能明确指定闭包的生命周期。不过,有几种方法可以使此代码正常工作。
最简单的解决方案是简单地省略类型注释并让编译器推断所有内容:

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;
最后,最通用的解决方案是使用辅助函数来应用绑定(bind)到闭包的函数特征:
fn constrain_closure<F: Fn(&i64) -> &i64>(f: F) -> F {
    f
}

let _ref_in_ref_out = constrain_closure(|var| var);

关于rust - 为什么我不能从闭包返回引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63843906/

相关文章:

rust - 从 Rust 中的 HashMap 中删除随机条目

Swift 命令行工具在 Debug模式下构建,但不在 Release模式下构建

rust - 从消耗值中计算出生命周期以供引用

c++ - C++中类的静态数据成员和静态方法是静态对象吗?

rust - Rust 中的文字字符串和 Args 有什么区别?

rust - "expected type parameter, found struct"实现特征时

javascript - 在循环中使用相同的变量来解决 "Closures in the loop"问题

rust - 如何用生命周期初始化一个变量?

rust - “error: expected item, found ' 让 '”

ios - 如果不在 Swift 的内部范围内使用,是否不保留闭包变量?