如何解决为什么我不能从闭包中返回引用?
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,也不能明确指定闭包的生存期。但是,有几种方法可以使此代码起作用。
最简单的解决方案是简单地省略类型注释,并让编译器推断所有内容:
yum
或者,实际上也可以指定返回类型。编译:
dnf
对于闭包没有关闭任何局部变量的情况,另一个选择是将其转换为函数指针,因为生存期省略规则适用于函数指针:
dnf install vim
最后,最通用的解决方案是使用一个辅助函数来应用绑定到您的闭包的函数特征:
let ref_in_ref_out = |var| var;
let i: i64 = 42;
ref_in_ref_out(&i);
,
我刚刚找到了解决此问题的方法,但是如果有一个更简单的解决方案,那就太好了
fn infer_lifetime<'a,T: 'a,F: Fn(&'a T) -> &'a T>(f: F) -> F {
f
}
fn main() {
let _ref_in_ref_out = infer_lifetime(|var: &i64| var);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。